抽象基类的派生类未正确覆盖基纯虚拟方法

Derived Class of Abstract Base Class does not correctly override Base pure virtual method

本文关键字:覆盖 虚拟 方法 基类 派生 抽象      更新时间:2023-10-16

所以我正在尝试创建一个抽象基类的派生类,但纯虚拟方法不能使用派生类声明。

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添加方法。

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

add(const Foo<T>* rhs)

add(const Doo<T>* rhs)

他们采取不同的论点。

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

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

防止这些错误的最佳方法是每次打算覆盖虚拟函数时override如下关键字(在您的示例中(:

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

如果函数实际上没有覆盖,编译器将发出错误。