[英]C++ A multiple inheritance pproblem with pure virtual functions
我已經制作了一個最小的例子來復制我看到的具有更復雜的類層次結構的問題:
#include <string>
#include <iostream>
class A
{
protected:
virtual
~A() = 0;
};
inline
A::~A() {}
class B : public A
{
public:
virtual
~B()
{
}
std::string B_str;
};
class BB : public A
{
public:
virtual
~BB()
{
}
std::string BB_str;
};
class C : public A
{
protected:
virtual
~C()
{
}
virtual
void Print() const = 0;
};
class D : public B, public BB, public C
{
public:
virtual
~D()
{
}
};
class E : public C
{
public:
void Print() const
{
std::cout << "E" << std::endl;
}
};
class F : public E, public D
{
public:
void Print_Different() const
{
std::cout << "Different to E" << std::endl;
}
};
int main()
{
F f_inst;
return 0;
}
使用g++ --std=c++11 main.cpp
編譯會產生錯誤:
error: cannot declare variable ‘f_inst’ to be of abstract type ‘F’
F f_inst;
note: because the following virtual functions are pure within ‘F’:
class F : public E, public D
^
note: virtual void C::Print() const
void Print() const = 0;
^
所以編譯器認為Print()
是純虛擬的。
但是,我已經在class E
指定了Print()
應該是什么。
所以,我誤解了一些繼承規則。
我的誤解是什么,我該如何糾正這個問題?
注意:如果我刪除繼承: public D
from class F
,它將編譯。
目前,您的F
以兩種不同的方式從C
派生而來。 這意味着F
對象有兩個獨立的C
基礎,因此有兩個C::Print()
實例。
您只覆蓋當前通過E
來的那個。
要解決此問題,您必須采用以下選項之一:
D::Print()
或F::Print()
來覆蓋通過D
來的那個Print
不純C
基礎。對於后一個選項,語法調整將是:
class E : virtual public C
和
class D : public B, public BB, virtual public C
這意味着D
和E
都將具有與其父級相同的C
實例,因此覆蓋E::Print()
覆蓋該C
'下游'的所有類的函數。
有關更多信息,請查找“鑽石繼承問題”。 另見多重繼承常見問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.