为什么我不能创建新的类实例,它是我的抽象基类的派生类?我的派生类有覆盖基本方法但有不同的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() ;
编译器返回“无法实例化抽象类”
为什么呢?在我看来它应该有效。
答案 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。