因此,我尝试创建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方法声明能够起作用,因为Doo
是Foo
的子类,但是g ++表示我没有重写Foo's
的add方法。我假设这与我声明Doo's
添加方法的方式很简单。
答案 0 :(得分:0)
签名不匹配,因此您不会覆盖任何内容。查找override
关键字以获取编译器,以帮助您诊断此类错误。
add(const Foo<T>* rhs)
与
不同add(const Doo<T>* rhs)
他们有不同的论点。
它们还返回不同的类型。但是返回类型在重载解析或覆盖时无关紧要,但这通常也表示您缺少(要覆盖的内容)标记,因为通常 您希望您的覆盖函数返回与它覆盖的类型相同。
答案 1 :(得分:0)
通过使用具有不同签名的函数,您可以隐藏该函数,而不是覆盖它。
防止出现此类错误的最佳方法是,每次打算覆盖虚拟函数时,都按以下方式(在您的示例中)使用override
关键字:
Doo<T>* add(const Doo<T>* rhs) override
然后,如果该函数未实际覆盖,则编译器将发出错误。