类多继承及虚继承探研

多继承产生的问题

  1. #include <iostream>
  2. using namespace std;
  3. // 多继承产生的问题:如果一个继承的多继承有同一个父类,
  4. // 则父类的构造函数会被调用两次
  5. //////////////////////////////////////////////////////////////////////////
  6. // 多继承,多基类混乱的问题
  7. // 以下代码的结果
  8. /*
  9. 总类 A 构造函数被调用。。。
  10. 类 A1 构造函数被调用。。。
  11. 总类 A 构造函数被调用。。。
  12. 类 A1 构造函数被调用。。。
  13. 类 F 构造函数被调用。。。
  14. */
  15. class A
  16. {
  17. public:
  18. A()
  19. {
  20. cout << "总类 A 构造函数被调用。。。" << endl;
  21. }
  22. };
  23. class A1 :public A
  24. {
  25. public:
  26. A1()
  27. {
  28. cout << "类 A1 构造函数被调用。。。" << endl;
  29. }
  30. };
  31. class A2 :public A
  32. {
  33. public:
  34. A2()
  35. {
  36. cout << "类 A1 构造函数被调用。。。" << endl;
  37. }
  38. };
  39. class F :public A1, public A2
  40. {
  41. public:
  42. F()
  43. {
  44. cout << "类 F 构造函数被调用。。。" << endl;
  45. }
  46. };
  47. int main1()
  48. {
  49. F f;
  50. return 0;
  51. }
#

#虚继承解决多继承产生的问题

  1. #include <iostream>
  2. using namespace std;
  3. //////////////////////////////////////////////////////////////////////////
  4. // 使总基类虚继承,可避免因为多继承,多基类混乱的问题
  5. // 以下代码的结果
  6. /*
  7. 总类 A 构造函数被调用。。。
  8. 类 A1 构造函数被调用。。。
  9. 类 A1 构造函数被调用。。。
  10. 类 F 构造函数被调用。。。
  11. 请按任意键继续. . .
  12. */
  13. class AA
  14. {
  15. public:
  16. AA()
  17. {
  18. cout << "总类 A 构造函数被调用。。。" << endl;
  19. }
  20. };
  21. class AA1 : virtual public AA
  22. {
  23. public:
  24. AA1()
  25. {
  26. cout << "类 A1 构造函数被调用。。。" << endl;
  27. }
  28. };
  29. class AA2 :virtual public AA
  30. {
  31. public:
  32. AA2()
  33. {
  34. cout << "类 A1 构造函数被调用。。。" << endl;
  35. }
  36. };
  37. class FF :public AA1, public AA2
  38. {
  39. public:
  40. FF()
  41. {
  42. cout << "类 F 构造函数被调用。。。" << endl;
  43. }
  44. };
  45. int main()
  46. {
  47. FF f;
  48. return 0;
  49. }

来自为知笔记(Wiz)

时间: 2024-10-09 06:57:49

类多继承及虚继承探研的相关文章

【整理】C++虚函数及其继承、虚继承类大小

参考文章: http://blog.chinaunix.net/uid-25132162-id-1564955.html http://blog.csdn.net/haoel/article/details/1948051/ 一.虚函数与继承 1.空类,空类单继承,空类多继承的sizeof #include <iostream> using namespace std; class Base1 { }; class Base2 { }; class Derived1:public Base1

C++ 继承之虚继承与普通继承的内存分布

仅供互相学习,请勿喷,有观点欢迎指出~ class A { virtual void aa(){}; }; class B : public virtual A { char j[3]; //加入一个变量是为了看清楚class中的vfptr放在什么位置 public: virtual void bb(){}; }; class C : public virtual A { char i[3]; public: virtual void cc(){}; }; class C1 : public A

C++ 多继承和虚继承的内存布局(Memory Layout for Multiple and Virtual Inheritance)

警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识. 在本文中,我们解释由gcc编译器实现多继承和虚继承的对象的布局.虽然在理想的C++程序中不需要知道这些编译器内部细节,但不幸的是多重继承(特别是虚拟继承)的实现方式有各种各样的不太明确的结论(尤其是,关于向下转型指针,使用指向指针的指针,还有虚拟基类的构造方法的调用命令). 如果你了解多重继承是如何实现的,你就能预见到这些结论并运用到你的代码中.而且,如果你关心性能,理解虚拟继承的开销也是非常有用的.最后,这很有趣. :-) 多重

转载:C++ 多继承和虚继承的内存布局

C++ 多继承和虚继承的内存布局[已翻译100%] 英文原文:Memory Layout for Multiple and Virtual Inheritance 标签: <无> run_mei 推荐于 4年前 (共 14 段, 翻译完成于 10-17) 评论 46 分享 收藏 198 参与翻译 (5人) : super0555, polarisxxm, Ley, zaobao, 开源中国吹牛第一仅中文 | 中英文对照 | 仅英文 | 打印此文章 警告. 本文有点技术难度,需要读者了解C++和

C++ 多继承和虚继承的内存布局(转)

转自:http://www.oschina.net/translate/cpp-virtual-inheritance 警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识. 在本文中,我们解释由gcc编译器实现多继承和虚继承的对象的布局.虽然在理想的C++程序中不需要知道这些编译器内部细节,但不幸的是多重继承(特别是虚拟继承)的实现方式有各种各样的不太明确的结论(尤其是,关于向下转型指针,使用指向指针的指针,还有虚拟基类的构造方法的调用命令). 如果你了解多重继承是如何实现的,你就能

c++第十章-(多继承与虚继承)

多继承 class Person { public: Person(std::string theName); void introduce(); protected: std::string name; }; class Teacher : public Person { public: Teacher(std::string theName,std::string theClass); void teach(); void introduce(); protected: std::strin

More Effective C++----(24)理解虚拟函数、多继承、虚继承和RTTI所需的代价

Item M24:理解虚拟函数.多继承.虚继承和RTTI所需的代价 C++编译器们必须实现语言的每一个特性.这些实现的细节当然是由编译器来决定的,并且不同的编译器有不同的方法实现语言的特性.在多数情况下,你不用关心这些事情.然而有些特性的实现对对象大小和其成员函数执行速度有很大的影响,所以对于这些特性有一个基本的了解,知道编译器可能在背后做了些什么,就显得很重要.这种特性中最重要的例子是虚拟函数. 当调用一个虚拟函数时,被执行的代码必须与调用函数的对象的动态类型相一致:指向对象的指针或引用的类型

C++中对C的扩展学习新增内容———面向对象(继承)多继承和虚继承

多继承和虚继承 1.多继承的优缺点 (1) 多继承可以复用多个类的代码(函数,变量). (2) 多继承会带来二义性问题. // 1. 多继承优缺点 class Flyable { public: void fly() { cout << "飞翔..." << endl; } void sound() { cout << "嗖嗖..." << endl; } }; class Runnable { public: voi

多继承(虚继承)派生类对象内存结构

在这里谈一下虚继承.前面写过派生类对象的内存结构,都是基于VS2010编译器的,不同的编译器对于继承的处理不同,但本质都是一样的. 虚继承是解决共享基类问题的.例如在菱形继承中 如果不使用虚继承,基类A在D中会有两个,这不仅浪费内存,还会造成歧义.使用虚继承就可以解决基类共享的问题. 要想在派生类中共享基类(例如在D对象中只有一个A对象,这时候D对象中的B对象和C对象都可以查找到A,而不是在B对象和C对象中各含有一个A对象). 先看下面一个例子: #include<iostream> usin