【发布时间】:2021-12-06 08:59:16
【问题描述】:
我尝试编译程序,但编译器将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;
}
【问题讨论】:
-
int get_type()和char get_parameter()不是同一类型 -
ParameterExpr继承自IParameterExpression,它有一个纯虚成员函数get_type,它本身继承自IMetaExpression。因为ParameterExpr没有实现那个纯虚成员函数,所以它使那个类abstract。缺少get_type与Expr::get_type无关。 -
@Eljay 但 ParameterExpr 的基类实际上实现了方法
get_type。这就是我认为 ParameterExpre 自动实现get__type的原因 -
那是一个不同的
get_type。如果您希望它与get_type相同,则需要使用虚拟继承。
标签: c++ inheritance