簡體   English   中英

C++,父母同祖的孩子

[英]C++, child with both parents having a same ancestor

我現在遇到 C++ 類和 inheritance 的問題...

假設我們有

Class A {
A(string name);
    ~A();
    void func(void);
}
Class B : public A {
    B(string name);
    ~B();
    ...
}
Class C : public A {
    C(string name);
    ~C();
    ...
}
Class D : public B, public D {
    D(string name);
    ~D();
    ...
}

每當我創建D時,它都會調用B的構造函數和C的構造函數,這會導致A的多個實例。 然后編譯器說它不知道應該調用哪個“函數”,是來自B的那個還是來自C的那個。

我想知道如何只調用A構造函數一次,然后用它來構建BC

我已經嘗試使用B::func()來調用func()但我必須在 class A 構建器中有一個 cout。 結果是錯誤的 output。

這稱為菱形 inheritance 圖案
為了避免AD中有 2 個實例,您需要使用虛擬 inheritance
B等類實際上繼承A時,這意味着A將僅在從這些類派生的 class 中出現一次。
注意:在這種情況下,最派生的 class 負責初始化虛擬基礎 - 如下所示。

以下代碼中的 output 對其進行了演示:

#include <iostream>
#include <string>

class A {
public:
    A(std::string const & name) { std::cout << "A::A\n"; };
    ~A() {};
    void func(void);
};
//--------vvvvvvv-----------
class B : virtual public A {
public:
    B(std::string const& name) : A(name) { std::cout << "B::B\n"; };
    ~B() {};
};
//--------vvvvvvv-----------
class C : virtual public A {
public:
    C(std::string const& name) : A(name) { std::cout << "C::C\n"; };
    ~C() {};
};
class D : public B, public C {
public:
//-------------------------------vvvvvvv---------------------------------------------
    D(std::string const& name) : A(name), B(name), C(name) { std::cout << "D::D\n"; };
    ~D() {};
};

int main()
{
    D d("aaa");
}

Output:

A::A
B::B
C::C
D::D

AD中出現一次。

請注意,如果您刪除virtual關鍵字,則 output 將是:

A::A
B::B
A::A
C::C
D::D

AD中出現兩次(如您所見)。


一些旁注:

  1. 最好避免using namespace std - 請參閱此處為什么“使用命名空間標准;” 被認為是不好的做法? .
  2. 您的代碼包含許多拼寫錯誤: Class應該是class ,缺少; 在課程結束時。
  3. 您的構造函數可以通過const &接受name ,如我的代碼中所示,以避免復制。

暫無
暫無

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

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