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
{
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
相关文章推荐
- 子类虚函数C++ 继承中子类与父类虚函数入栈顺序 及父类私有虚函数的调用方式
- C++ 继承中子类与父类虚函数入栈顺序 及父类私有虚函数的调用方式
- java基础------>继承--->属性(在子类中调用父类同名属性的两种方式)
- C++子类显示调用父类的构造函数
- C++和JAVA中一些区别,包括指向子类的引用会调用谁的方法,子类构造函数自动调用父类构造函数时,父构造会调用的谁方法
- c++ 父类和子类的方法调用
- 关于如何在不使用虚函数的情况下父类调用子类成员函数的问题
- C++子类显示调用父类的构造函数
- 子类继承父类的虚函数调用
- C/C++ 子类调用父类中的私有成员变量(对比JAVA)
- 子类重写父类的虚函数后需要调用父类的虚函数
- C++父类子类间函数重定义,虚函数重写(覆盖)以及重载
- C++析构函数的自动调用(析构函数必须是虚拟的,这样删除父类指针指向的子类对象,才能同时调用两者的析构函数,否则就没有机会调用子类析构函数)
- C++子类调用父类覆盖的函数
- C++子类如何调用父类构造函数
- C++ 子类B重载父类A的方法funA后,在父类A中调用funA会调用子类B还是父类A的funA方法?
- C++中子类调用父类的有参构造函数
- <转载学习>子类对父类构造方法调用小结
- c++和java中关于如何调用父类方法和子类方法的辨析
- c++与java中子类中调用父类成员的方法