[英]How does virtual inheritance actually work?
我知道鑽石問題,但問題是-當我在Google中進行“虛擬繼承”時,結果僅提及鑽石問題。 我想知道它的一般工作原理,以及它與常規繼承有何不同。
我知道一個類(通常)從另一個類繼承時,它僅包含其所有成員(字段和方法,不包括訪問級別)。 其中一些可能會被新成員覆蓋或隱藏,但它們仍然存在。 繼承還定義了層次結構中類之間的某些關系,這些關系會影響轉換和多態性。
現在虛擬繼承有何不同? 例如:
class A
{
public:
int a;
int b;
void fun(int x)
{}
void gun(int x)
{}
};
class B : public A
{
public:
int a;
int c;
void fun(int x)
{}
void hun(int x)
{}
};
class C : virtual public A
{
public:
int a;
int c;
void fun(int x)
{}
void hun(int x)
{}
};
B
和C
什么區別? 我的示例沒有利用其他差異嗎? 標准怎么說? 另外,如果C ++ 03和C ++ 11之間存在差異,請提及。
有了一個單一的繼承級別,行為就沒有區別。
區別在於從多個基類繼承時,這些基類本身具有一個公共基類:
struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct D : B,C {};
在此示例中,通過虛擬繼承, D
僅包含一個A
子對象,其B
和C
子對象共享; 這是“鑽石”模式:
A
/ \
B C
\ /
D
沒有虛擬繼承,它將包含兩個A
子對象,並且沒有“鑽石”:
A A
| |
B C
\ /
D
具有或不具有多重繼承,如果您具有多個繼承級別,仍然存在差異:虛擬基類必須由最派生的類而不是其直接派生的類初始化。 這是為了避免在多重繼承的情況下的歧義,在多重繼承的情況下(在上面的示例中) B
和C
都將負責初始化共享的A
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.