C++多继承与虚继承
生活随笔
收集整理的這篇文章主要介紹了
C++多继承与虚继承
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
多繼承與虛繼承以及存在的問題
例子
多繼承與虛繼承以及存在的問題
虛繼承
有了多繼承,虛繼承才會有意義
如果有個菱形結構的繼承,爺爺類為A,然后B,C是A的派生類,最后D是B和C的派生類,
如果在A中有一個成員變量a,D去調用就會出現訪問不明確,
虛繼承就可以解決訪問不明確的這種問題
如果這樣繼承B,C虛繼承了A,virtual public,然后D繼承B,C
通常的理解方式!
在虛繼承之后,A里面的成員變量a是不復制給B和C的,而是只給了B和C使用權,所以D也只有使用權
多繼承,虛繼承不建議用,結構復雜,內存開銷比較大。
用菱形的結構簡單的就可以了,可讀性比較好
這里的A叫做虛基類
?
例子
采用多繼承,會出現訪問不明確的問題。
如下代碼:
#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; }運行報錯截圖如下:
?
此時采用虛繼承就能很好的解決這個問題:
代碼如下:
#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; }運行截圖如下:
總結
以上是生活随笔為你收集整理的C++多继承与虚继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt多线程-QThreadPool线程池
- 下一篇: error: undefined ref