您的位置:首页 > 编程语言 > C语言/C++

C++进阶—>子类、父类、父父类间虚函数调用详解

2017-10-28 10:46 627 查看
class one
{
public:
one(int data=0):m1_data(data)
{

}

int GetData()
{
return dodata();
}

virtual int dodata()
{
return m1_data;
}

public:
int m1_data;
};

class two:public one
{
public:
two(int data=1):m2_data(data)
{

}

int dodata()
{
return m2_data;
}

public:
int m2_data;
};

class three:public two
{
public:
three(int data=2):m3_data(data)
{

}

public:
int m3_data;
};

int _tmain(int argc, _TCHAR* argv[])
{
three t(3);

cout<<t.GetData()<<endl;
cout<<t.one::GetData()<<endl;
cout<<t.two::GetData()<<endl;
cout<<t.three::GetData()<<endl;

cout<<t.dodata()<<endl;
cout<<t.one::dodata()<<endl;
cout<<t.two::dodata()<<endl;
cout<<t.three::dodata()<<endl;

system("pause");
return 0;

上述代码,three继承于two,two继承于one,实例化一个three对象,分别调用GetData(仅one类中有)和dodata(虚函数 two中重写)函数

程序执行结果为:
1:执行t.GetData(),three中无此函数,去父类two找也无此函数,再去父父类one中找到了此函数,执行调用了dodata函数,因为dodata为虚函数(虚函数实现了多态,根据实例化的对象选择调用哪个类中的函数,父类为虚函数 子类默认为虚函数 习惯上要在子类的函数前加上vitural关键字 也可不加)寻找two类中是否存在对此函数的重写,two存在重写,然后去three类中找对two类中dodata函数的重写,发现three中无dodata函数,则调用three父类的dodata函数,输出1。

1:加上了类作用符,直接执行one中的GetData,后续执行过程同上。

1:加上了类作用符,直接执行two中的GetData,发现不存在此函数,去父类one中找,后续执行过程同上。

1:直接执行three中的GetData,不存在此函数,后续执行过程同第一步。

1:去three中找dodata,不存在,再去父类two中找,虚函数dodata直接执行。

0:加上了类作用符,直接执行one中的dodata。

1:加上了类作用符,直接执行two中的dodata。

1:加上了类作用符,直接执行three中的dodata,但没有此函数,再去父类two中找,虚函数dodata直接执行。

对于子类、父类构造函数中虚函数间的调用关系可以参考http://blog.csdn.net/u012273328/article/details/51173111
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐