我試圖編譯程式,但編譯器將ParameterExpr類視為抽象類。我沒有使用多重繼承,我認為它應該可以作業(因為get_type實際上是在Expr類中實作的)
class IMetaExpression
{
public:
virtual int get_type(void) = 0;
virtual ~IMetaExpression(){}
};
class IParameterExpression : public IMetaExpression
{
public:
virtual char get_parameter(void) = 0;
};
class Expr : public IMetaExpression
{
public:
virtual int get_type(void) override { return 0; }
};
class ParameterExpr : public Expr, public IParameterExpression
{
public:
virtual char get_parameter(void) override { return 'c';}
//virtual int get_type(void) override { return 0; }
};
int main()
{
auto p = new ParameterExpr();
p->get_type();
delete p;
return 0;
}
uj5u.com熱心網友回復:
我相信這是一個稱為鉆石問題的問題。 https://www.geeksforgeeks.org/multiple-inheritance-in-c/
這是兩個類完全或部分繼承自一個基類的地方,基類還有一個繼承這兩個類的子類。創建菱形。
解決這個問題的方法是增加virtual兩個中間類的繼承。導致:
class IParameterExpression : virtual public IMetaExpression
和
class Expr : virtual public IMetaExpression
這允許基類的建構式只被呼叫一次并在所有繼承的類之間共享功能。
我不是鉆石問題的專家,因此請多加說明。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325453.html
