无法实例化抽象类,但类不是抽象/派生方法的参数

时间:2018-06-01 07:44:20

标签: c++ c++11

为什么我不能创建新的类实例,它是我的抽象基类的派生类?我的派生类有覆盖基本方法但有不同的parametr,它是基类param的派生类。

class BaseArg {

} ;

class DerivedArg :public BaseArg{

} ;

class BaseHandler{
public:
virtual void handle(BaseArg* arg) = 0;
} ;

DerivedHandler {
void handle(DerivedArg* arg) {}
} ;


auto x = new DerivedHandler() ;

编译器返回“无法实例化抽象类”

为什么呢?在我看来它应该有效。

1 个答案:

答案 0 :(得分:2)

class BaseHandler
{
    public:
    virtual void handle(BaseArg* arg) = 0;
};

您声明了一个虚拟函数handle,它需要能够接受任何BaseArg

class DerivedHandler : public BaseHandler
{
public:
    void handle(DerivedArg* arg) { }
};

您的覆盖函数只接受一种特定类型的BaseArg,因此仅为(更一般!)继承的函数handle提供实现是不够的。另一种方式是有效的(理论上只有,见下文) - 或者它会(确实)使用返回类型,因为DerivedArg返回的总是BaseArg也是...... < / p>

概述:

class Base
{
public:
    virtual void f0(BaseArg* arg) = 0;
    virtual void f1(DerivedArg* arg) = 0;
    virtual BaseArg* f2() = 0;
    virtual DerivedArg* f3() = 0;
};

class Derived : public Base
{
public:
    virtual void f0(DerivedArg* arg) override; // FAILS!
    virtual void f1(BaseArg* arg) override;    // (fine...)(*)
    virtual DerivedArg* f2() override;         // fine...
    virtual BaseArg*    f3() override;         // FAILS!
};

(*)实际上,这个案例在理论上是理想的。但是,C ++不支持逆变函数参数,所以这种情况也会失败(新函数只被视为过载)!

有关详细信息,请查看Wikipedia