【C++深度剖析教程31】被遗弃的多重继承
生活随笔
收集整理的這篇文章主要介紹了
【C++深度剖析教程31】被遗弃的多重继承
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
加qq1126137994 微信:liu1126137994
C++中是否允許一個類繼承多個父類?
C++支持編寫多重繼承的代碼:
- 一個子類可以擁有多個父類
- 子類擁有所有父類的成員變量
- 子類繼承父類所有的成員函數
- 子類對象可以當做任意父類對象使用
多重繼承的語法規則:
多重繼承的本質與單繼承相同
編程示例;
#include <iostream> #include <string>using namespace std;class BaseA {int ma; public:BaseA(int a){ma = a;}int getA(){return ma;} };class BaseB {int mb; public:BaseB(int b){mb = b;}int getB(){return mb;} };class Derived : public BaseA, public BaseB {int mc; public:Derived(int a, int b, int c) : BaseA(a), BaseB(b){mc = c;}int getC(){return mc;}void print(){cout << "ma = " << getA() << ", "<< "mb = " << getB() << ", "<< "mc = " << mc << endl;} };int main() {cout << "sizeof(Derived) = " << sizeof(Derived) << endl; // 12Derived d(1, 2, 3);d.print();cout << "d.getA() = " << d.getA() << endl;cout << "d.getB() = " << d.getB() << endl;cout << "d.getC() = " << d.getC() << endl;cout << endl;BaseA* pa = &d;BaseB* pb = &d;cout << "pa->getA() = " << pa->getA() << endl;cout << "pb->getB() = " << pb->getB() << endl;cout << endl;void* paa = pa;void* pbb = pb;if( paa == pbb ){cout << "Pointer to the same object!" << endl; }else{cout << "Error" << endl;}cout << "pa = " << pa << endl;cout << "pb = " << pb << endl;cout << "paa = " << paa << endl;cout << "pbb = " << pbb << endl; return 0; }運行結果:
分析以上程序我們就可以發現問題所在啦:
1、通過多重繼承的對象可能擁有不同的地址
2、多重繼承可能產生冗余的成員:
當多重繼承關系閉合將產生數據冗余問題
解決辦法是:
虛繼承!!!
下面看一個解決冗余的例子:
#include <iostream> #include <string>using namespace std;class People {string m_name;int m_age; public:People(string name, int age){m_name = name;m_age = age;}void print(){cout << "Name = " << m_name << ", "<< "Age = " << m_age << endl;} };class Teacher : virtual public People { public:Teacher(string name, int age) : People(name, age){} };class Student : virtual public People { public:Student(string name, int age) : People(name, age){} };class Doctor : public Teacher, public Student { public:Doctor(string name, int age) : Teacher(name, age), Student(name, age), People(name, age){} };int main() {Doctor d("Delphi", 33);d.print();return 0; }運行結果為;
Name = Delphi, Age = 33
雖然我們解決的數據冗余,但是還有一個問題,在架構設計師,無法確定使用虛繼承還是直接繼承???
3、多重繼承有可能會產生多個虛函數表
工程開發中的多繼承方式:
運行結果:
p->getI() = 100
p->getI() = 40
pInt1 == p : 1
pInt2 == p : 1
一些有用的工程建議:
總結:
總結
以上是生活随笔為你收集整理的【C++深度剖析教程31】被遗弃的多重继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奇怪的技能又增加了,我学会了用ETS5配
- 下一篇: 【Makefile由浅入深完全学习记录4