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