1,C++ 中是否允许一个类继承自多个父类?
1,可以;
2,这种情况就是多重继承;
3,多重继承的表象就是一个类有多个父类;
4,这是 C++ 非常特别的一个特性,在其他的程序设计语言中比如 C#、Java、Object Pascal 中都只支持单重继承;
2,C++ 支持编写多重继承的代码:
1,一个子类可以拥有多个父类;
2,子类拥有所有父类的成员变量;
3,子类继承所有父类的成员函数;
4,子类对象可以当作任意父类对象使用;
3,多重继承的语法规则:
1,代码示例:
1 class Derived : public BaseA, public BaseB, public BaseC 2 { 3 // ... 4 };
2,多重继承的本质与单继承相同;
4,多重继承问题一编程实验:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class BaseA 7 { 8 int ma; 9 10 public: 11 BaseA(int a) 12 { 13 ma = a; 14 } 15 16 int getA() 17 { 18 return ma; 19 } 20 }; 21 22 class BaseB 23 { 24 int mb; 25 26 public: 27 BaseB(int b) 28 { 29 mb = b; 30 } 31 32 int getB() 33 { 34 return mb; 35 } 36 }; 37 38 class Derived : public BaseA, public BaseB 39 { 40 int mc; 41 42 public: 43 Derived(int a, int b, int c) : BaseA(a), BaseB(b) // 初始化列表中同时调用父类的构造函数; 44 { 45 mc = c; 46 } 47 48 int getC() 49 { 50 return mc; 51 } 52 53 void print() 54 { 55 cout << "ma = " << getA() << ", " 56 << "mb = " << getB() << ", " 57 << "mc = " << mc << endl; 58 } 59 }; 60 61 int main() 62 { 63 cout << "sizeof(Derived) = " << sizeof(Derived) << endl; // 12 64 65 Derived d(1, 2, 3); 66 67 d.print(); 68 69 cout << "d.getA() = " << d.getA() << endl; // 1 70 cout << "d.getB() = " << d.getB() << endl; // 2 71 cout << "d.getC() = " << d.getC() << endl; // 3 72 73 cout << endl; 74 75 BaseA* pa = &d; 76 BaseB* pb = &d; 77 78 cout << "pa->getA() = " << pa->getA() << endl; // 1 79 cout << "pb->getB() = " << pb->getB() << endl; // 2 80 81 cout << endl; 82 83 void* paa = pa; 84 void* pbb = pb; 85 86 87 if( paa == pbb ) 88 { 89 cout << "Pointer to the same object!" << endl; 90 } 91 else 92 { 93 cout << "Error" << endl; // 打印 Error; 94 } 95 96 cout << "pa = " << pa << endl; // 0xbfe7e304 97 cout << "pb = " << pb << endl; // 0xbfe7e308 98 cout << "paa = " << paa << endl; // 0xbfe7e304 99 cout << "pbb = " << pbb << endl; // 0xbf7e308 100 101 return 0; 102 }
5,通过多重继承得到的对象可能拥有“不同地址”:
1,解决方案:无;
2,多重继承成员变量排布:
1,指向同一个对象的不同位置;
2,不方便开发了,因为我们一般比较这两个指针是否相同来判断是否指向同一个对象;
3,这里两个地址值不同依然可能指向同一个对象,情况变得非常复杂;
6,多重继承可能产生冗余的成员:
1,Doctor 这个类有两个 m_name,两个 m_age;
7,多重继承问题二编程实验:
1,描述 本文6 中类图:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class People 7 { 8 string m_n