所以我發現自己的類的層次結構有點混亂。
我的代碼看起來有點像這樣,過于簡化:
我的代碼看起來有點像這樣,過于簡化。
#include <iostream>
struct Parent {
virtual void pureVirtual()= 0;
};
struct Child : public Parent {
void pureVirtual() override {
std::cout << "Child::pureVirtual()" << std::endl;
}
};
struct Brother。public Parent {
};
struct GrandChild : public Child, public Brother {
};
GrandChild測驗。
編譯失敗的原因是:
抽象型別別 "GrandChild "的物件是不允許的。--純虛擬函式 "Parent::pureVirtual "沒有overriderC/C (322)
。
我不完全理解為什么pureVirtual的實作不被GrandChild從Child繼承。
在實踐中,我有大量的純虛擬函式需要 "重新實作",也就是說,只需要寫上這樣的幾行字:
struct GrandChild : public Child,public Brother {
void pureVirtual() override {
Child::pureVirtual()。
}
};
我本以為編譯器會自動使用Child的實作。
我是否可以使用某種技巧來告訴編譯器我將重新使用Child中的所有實作?
無論如何,我可能要想出一個更好的設計,但這讓我對是否有簡單的解決方案感興趣。
uj5u.com熱心網友回復:
問題是你實際上是得到兩個pureVirtual函式。C 并沒有聰明到在默認情況下將這兩個函式合并。你可以使用虛擬繼承來強制執行該行為。
#include <iostream>
struct Parent {
virtual void pureVirtual()= 0;
};
struct Child : virtual public Parent{
void pureVirtual() override{
std::cout << "Child::pureVirtual()" << std::endl。
}
};
struct Brother : virtual public Parent{};
struct GrandChild : public Child, public Brother{};
int main() {
GrandChild測驗。
}
uj5u.com熱心網友回復:
我不完全理解為什么
pureVirtual的實作沒有被GrandChild從Child繼承下來。
事實上,GrandChild確實繼承了Child中pureVirtual()的override實作。
但是,GrandChild也從Brother繼承了pureVirtual()。 Brother是抽象的,因為它沒有覆寫它的pureVirtual()版本,因此GrandChild也是抽象的,除非它為Brother::pureVirtual()也提供一個覆寫。
你有一個經典的 Diamond 層次結構。 你需要使用虛擬繼承來解決這個問題。
你有一個典型的鉆石層次結構。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/320067.html
標籤:
上一篇:NSAlert的破壞性按鈕
