C++里的继承和多态(中)——分析单继承、多继承、菱形继承(不含虚函数)
来源:互联网 发布:java基础知识点汇总 编辑:程序博客网 时间:2024/05/17 03:22
1、单继承
class Base{public: Base() { cout << "Base()" << this << endl; } void FunTest1() { cout << "Base::FunTest1()" << endl; } void FunTest2() { cout << "Base::FunTest2()" << endl; } ~Base() { cout << "~Base()" << endl; } int _data1;};class Derive :public Base{public: void FunTest3() { cout << "Derive::FunTest3()" << endl; } int _data2;};int main(){ Base b; b.FunTest1(); b.FunTest2(); b._data1 = 0x04; Derive d; d.FunTest1(); d.FunTest2(); d.FunTest3(); d._data1 = 0x01; d._data2 = 0x02; return 0;}
——b对象和d对象的对象模型
main 函数的反汇编
派生类的构造函数:
程序运行结果:
构造函数:
基类构造函数:Base( )884 ->派生类构造函数: Base( )874 ->Derive( )874
析构函数:
派生类的析构函数:~Derive( )874 -> ~Base( )874->基类的析构函数:~Base( )884
2、多继承
class Base{public: Base() { cout << "Base()" << this << endl; } void FunTest1() { cout << "Base::FunTest1()" << endl; } void FunTest2() { cout << "Base::FunTest2()" << endl; } ~Base() { cout << "~Base()" << endl; } int _data1;};class Base1{public: Base1() { cout << "Base1()" << endl; } void FunTest3() { cout << "Base::FunTest3()" << endl; } void FunTest4() { cout << "Base::FunTest4()" << endl; } int _data3;};class Derive :public Base,public Base1{public: Derive() { cout << "Derive()" << this << endl; } void FunTest5() { cout << "Derive:FunTest5()" << endl; } ~Derive() { cout << "~Derive()" << endl; } int _data2;};int main(){ Base b; b.FunTest1(); b.FunTest2(); b._data1 = 0x04; Base1 b1; b1.FunTest3(); b1.FunTest4(); b1._data3 = 0x05; Derive d; d.FunTest1(); d.FunTest2(); d.FunTest3(); d.FunTest4(); d.FunTest5(); d._data1 = 0x01; d._data2 = 0x02; d._data3 = 0x03; return 0;}
对象模型:
main函数的反汇编:
派生类的构造函数:
先调用Base的构造函数,再调用Base1的构造函数
析构函数的调用:
先是派生类的析构函数,再试Base1的析构函数,最后是Base的析构函数
在派生类的析构函数中又会调用基类的析构函数:
在派生类的析构函数中,也是先调用Base1的析构函数,再调用Base的析构函数。与构造函数的顺序正好相反
程序运行的结果:
构造函数:
j基类的构造函数:Base( )D9c -> Base1( )D90 -> 派生类中的构造函数:Base( )D7c -> Base1 ( )D80 -> Derive( )D7c
析构函数:
派生类中的析构函数:~Derive( )D7c -> ~Base1( )D80 -> ~Base( )D7c ->基类的析构函数:~Base1( )D90 -> ~Base( )D9C
3、菱形继承
class Base{public : Base() { cout << "Base()" << this << endl; } void FunTest1() { cout << "Base::FunTest1()" << endl; } ~Base() { cout << "~Base()" << endl; }};class Derive : public Base{public : Derive() { cout << "Derive()" << this << endl; } void FunTest2() { cout << "Derive:FunTest2()" << endl; } ~Derive() { cout << "~Derive()" << endl; }};class Derive1 : public Base{public : Derive1() { cout << "Derive1()" << this << endl; } void FunTest3() { cout << "Derive:FunTest4()" << endl; } ~Derive1() { cout << "~Derive1()" << endl; }};class Derive2 : public Derive ,public Derive1{public : Derive2() { cout << "Derive2()" << endl; } void FunTest4() { cout << "Derive:FunTest4()" << endl; }};int main(){ Base b; b.FunTest1(); Derive d; d.FunTest1(); d.FunTest2(); Derive1 d1; d1.FunTest1(); d1.FunTest3(); Derive2 d2; //d2.FunTest1();会出现二义性 d2. Derive ::FunTest1(); d2. Derive1 ::FunTest1(); d2.FunTest2(); d2.FunTest3(); d2.FunTest4(); return 0;}
对象模型:
Derive和Derive1中都含有了Base,会产生二义性和数据冗余。
main函数的反汇编:
派生类的构造函数:
在派生类的构造函数中,都先调用的基类的构造函数。
Derive()
Derive1()
Derive2()
析构函数的调用:
析构函数的顺序和构造函数的顺序正好相反。
~Derive2( )->~Derive1( )->~Derive( )->~Base( ),
派生类中析构函数的调用:
在~Derive2(),先是自己的析构函数,再调用了~Derive1(),再调用了~Derive(),
在~Derive1( )中先是自己的析构函数,又调用了~Base()
在~Derive( )中先是自己的析构函数,又调用了~Base()
程序运行结果:
构造函数:
Base( )B8F ->
Derive的构造函数:Base( )B83 -> Derive( )B83->
Derive1的构造函数:Base( )B77 -> Derive1( )B77->
Derive2的构造函数:Base( )B6B -> Derive( )B6B ->Base( )B6C -> Derive1( )B6C ->Derive2( )B6B
析构函数:
~Derive2( )B6B -> ~Derive1( )B6C ->~Base( )B6C -> ~Derive( )B6B -> ~Base( )B6B
~Derive1( )B77 -> ~Base( )B77 -> ~Derive( )B83 -> ~Base( )B83
~Base( )B8F
0 0
- C++里的继承和多态(中)——分析单继承、多继承、菱形继承(不含虚函数)
- C++里的继承和多态(下)——单继承、多继承、菱形继承(含虚拟函数的继承)
- 继承(单继承、多继承、菱形继承、虚继承)
- c++继承(单继承,多继承,菱形继承和虚继承)详解
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】继承和多态之——菱形继承
- c++单继承、多继承、菱形继承的内存布局(虚函数表结构)
- C++中的类继承(4)继承种类之单继承&多继承&菱形继承
- c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】继承(菱形继承)
- C++ &继承(单继承.多继承.菱形(虚拟)继承)
- c++之各种继承(单继承,多继承,菱形继承)
- 单继承和菱形继承
- 继承和多态 3.0 -- 菱形继承
- 继承:单继承、派生类成员的访问属性、多继承、菱形继承、虚继承,菱形虚拟继承
- 多继承 菱形继承
- C++中的多态、单继承、多继承、菱形继承、菱形虚拟继承
- android 4G产品4G网络问题记录
- activeMQ networkConnectors
- 用Drawable来实现UI元素的间隔
- Smali和逆向分析
- Contains Duplicate
- C++里的继承和多态(中)——分析单继承、多继承、菱形继承(不含虚函数)
- 设计模式(7)之装饰模式
- 腾讯2016实习生招聘后台研发面试经
- 清空cookie
- CocoaPods的使用,简便方法
- C++第4次实验(提高班)—继承和派生1
- QT信号和槽以结构体为参数传递复杂数据
- Android布局控件之RelativeLayout
- 【好工具分享】如何进行屏幕录像记录操作步骤录制教程保存回放