[英]Polymorphism in C++: Do I have to give child class functions the same arguments as the parents - how to overload
[英]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
構造函數一次,然后用它來構建B
和C
。
我已經嘗試使用B::func()
來調用func()
但我必須在 class A 構建器中有一個 cout。 結果是錯誤的 output。
這稱為菱形 inheritance 圖案。
為了避免A
在D
中有 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
即A
在D
中出現一次。
請注意,如果您刪除virtual
關鍵字,則 output 將是:
A::A
B::B
A::A
C::C
D::D
即A
在D
中出現兩次(如您所見)。
一些旁注:
using namespace std
- 請參閱此處為什么“使用命名空間標准;” 被認為是不好的做法? .Class
應該是class
,缺少;
在課程結束時。const &
接受name
,如我的代碼中所示,以避免復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.