Abstract Base Class 的 Derived Class 没有正确覆盖 Base 纯虚方法
Derived Class of Abstract Base Class does not correctly override Base pure virtual method
所以我正在尝试创建抽象基 class 的派生 class,但是不能使用派生 class 声明纯虚方法。
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
的子 class,但是 g++ 说我没有覆盖 Foo's
添加方法。我假设这与我声明 Doo's
添加方法的方式很简单。
签名不匹配,因此您不能覆盖任何内容。查找 override
关键字,让您的编译器帮助您诊断此类错误。
add(const Foo<T>* rhs)
与
不同
add(const Doo<T>* rhs)
他们有不同的论点。
它们还 return 不同的类型。但是 return 类型在重载决策或覆盖时无关紧要,但它通常也是一个标志,表明您缺少标记(您想要覆盖的内容),因为 通常 您希望覆盖函数 return 与其覆盖的类型相同。
通过使用具有不同签名的函数,您隐藏了函数而不是覆盖它。
防止这些错误的最佳方法是每次您打算覆盖虚函数时使用 override
关键字(在您的示例中):
Doo<T>* add(const Doo<T>* rhs) override
如果函数实际上没有覆盖,编译器将发出错误。
所以我正在尝试创建抽象基 class 的派生 class,但是不能使用派生 class 声明纯虚方法。
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
的子 class,但是 g++ 说我没有覆盖 Foo's
添加方法。我假设这与我声明 Doo's
添加方法的方式很简单。
签名不匹配,因此您不能覆盖任何内容。查找 override
关键字,让您的编译器帮助您诊断此类错误。
add(const Foo<T>* rhs)
与
不同add(const Doo<T>* rhs)
他们有不同的论点。
它们还 return 不同的类型。但是 return 类型在重载决策或覆盖时无关紧要,但它通常也是一个标志,表明您缺少标记(您想要覆盖的内容),因为 通常 您希望覆盖函数 return 与其覆盖的类型相同。
通过使用具有不同签名的函数,您隐藏了函数而不是覆盖它。
防止这些错误的最佳方法是每次您打算覆盖虚函数时使用 override
关键字(在您的示例中):
Doo<T>* add(const Doo<T>* rhs) override
如果函数实际上没有覆盖,编译器将发出错误。