簡體   English   中英

虛擬繼承實際上是如何工作的?

[英]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)
    {}
};

BC什么區別? 我的示例沒有利用其他差異嗎? 標准怎么說? 另外,如果C ++ 03和C ++ 11之間存在差異,請提及。

有了一個單一的繼承級別,行為就沒有區別。

區別在於從多個基類繼承時,這些基類本身具有一個公共基類:

struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct D : B,C {};

在此示例中,通過虛擬繼承, D僅包含一個A子對象,其BC子對象共享; 這是“鑽石”模式:

    A
   / \
   B C
   \ /
    D

沒有虛擬繼承,它將包含兩個A子對象,並且沒有“鑽石”:

   A A
   | |
   B C
   \ /
    D

具有或不具有多重繼承,如果您具有多個繼承級別,仍然存在差異:虛擬基類必須由最派生的類而不是其直接派生的類初始化。 這是為了避免在多重繼承的情況下的歧義,在多重繼承的情況下(在上面的示例中) BC都將負責初始化共享的A

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM