抽象基类的派生类不能正确覆盖基类纯虚方法

时间:2019-04-09 18:48:00

标签: c++ inheritance abstract-class

因此,我尝试创建Abstract Base类的派生类,但是不能使用Derived类声明纯虚方法。

template<class T>
class Foo
{
    public:
        virtual Foo<T>* add(const Foo<T>* rhs) = 0; 
};

template<class T>
class Doo : public Foo<T>
{
    public:
        Doo<T>* add(const Doo<T>* rhs)
        {
            return this;
        }
};

int main()
{
    Doo<double> d;
    return 0;
}

我希望Doo中的add方法声明能够起作用,因为DooFoo的子类,但是g ++表示我没有重写Foo's的add方法。我假设这与我声明Doo's添加方法的方式很简单。

2 个答案:

答案 0 :(得分:0)

签名不匹配,因此您不会覆盖任何内容。查找override关键字以获取编译器,以帮助您诊断此类错误。

add(const Foo<T>* rhs)

不同
add(const Doo<T>* rhs)

他们有不同的论点。

它们还返回不同的类型。但是返回类型在重载解析或覆盖时无关紧要,但这通常也表示您缺少(要覆盖的内容)标记,因为通常 您希望您的覆盖函数返回与它覆盖的类型相同。

答案 1 :(得分:0)

通过使用具有不同签名的函数,您可以隐藏该函数,而不是覆盖它。

防止出现此类错误的最佳方法是,每次打算覆盖虚拟函数时,都按以下方式(在您的示例中)使用override关键字:

Doo<T>* add(const Doo<T>* rhs) override

然后,如果该函数未实际覆盖,则编译器将发出错误。