C++多继承与虚继承
生活随笔
收集整理的這篇文章主要介紹了
C++多继承与虚继承
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
?
多繼承與虛繼承以及存在的問(wèn)題
例子
多繼承與虛繼承以及存在的問(wèn)題
虛繼承
有了多繼承,虛繼承才會(huì)有意義
如果有個(gè)菱形結(jié)構(gòu)的繼承,爺爺類為A,然后B,C是A的派生類,最后D是B和C的派生類,
如果在A中有一個(gè)成員變量a,D去調(diào)用就會(huì)出現(xiàn)訪問(wèn)不明確,
虛繼承就可以解決訪問(wèn)不明確的這種問(wèn)題
如果這樣繼承B,C虛繼承了A,virtual public,然后D繼承B,C
通常的理解方式!
在虛繼承之后,A里面的成員變量a是不復(fù)制給B和C的,而是只給了B和C使用權(quán),所以D也只有使用權(quán)
多繼承,虛繼承不建議用,結(jié)構(gòu)復(fù)雜,內(nèi)存開(kāi)銷比較大。
用菱形的結(jié)構(gòu)簡(jiǎn)單的就可以了,可讀性比較好
這里的A叫做虛基類
?
例子
采用多繼承,會(huì)出現(xiàn)訪問(wèn)不明確的問(wèn)題。
如下代碼:
#include <iostream> using namespace std;class A{public:A(){m_valueA = 0;}int m_valueA;void print(){cout << "class A print() called!" << endl;} };class B: public A{};class C: public A{};class D: public B, public C{};int main(){D d;cout << d.m_valueA << endl;getchar();return 0; }運(yùn)行報(bào)錯(cuò)截圖如下:
?
此時(shí)采用虛繼承就能很好的解決這個(gè)問(wèn)題:
代碼如下:
#include <iostream> using namespace std;class A{public:A(){m_valueA = 0;}int m_valueA;void print(){cout << "class A print() called!" << endl;} };class B: virtual public A{};class C: virtual public A{};class D: public B, public C{};int main(){D d;cout << d.m_valueA << endl;getchar();return 0; }運(yùn)行截圖如下:
總結(jié)
以上是生活随笔為你收集整理的C++多继承与虚继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Qt多线程-QThreadPool线程池
- 下一篇: C++设计模式-使用Qt框架采用简单工厂