考虑派生类的基类,其中基类应该为其所有派生提供一些(多态)方法,例如armithmetic或bitweise重载运算符。派生类不应修改此操作以确保正确执行。但是,与此同时,我希望进行评估 - 在我的示例中使用函数isError() - 运算符必须是子类和纯虚拟的,因此必须定义:
class mom
{
public:
virtual bool operator && (const mom&) const final
{
return this->isError() && p_rOther.isError();
}
pritave:
virtual bool isError() = 0;
};
在现有标准下似乎不允许这样做,因为“纯虚拟性”意味着子类必须实现基类的所有虚函数,而“final”关键字与此范例相矛盾。
如何处理这个矛盾的任何建议或想法?
答案 0 :(得分:5)
我认为你被误导了如何处理纯虚拟成员函数以及它们的用途。
在从您的基础继承的类中,只有纯虚拟 的成员函数必须被定义为
我猜你在混淆整个Base
将成为抽象的事实。
这篇文章中的代码片段工作正常,并导致您所描述的行为。虽然virtual
函数final
使Base
函数失败了,但它的目的却失败了。
我建议您删除虚拟说明符。
这是,除非您的#include <iostream>
从虚拟功能所在的基地继承,并且您希望明确这一点未来的开发人员阅读您的代码。
struct Base {
virtual bool operator&& (Base const& rhs) const final {
std::cerr << "Base ::operator&& ()\n";
return this->error () && rhs.error ();
}
virtual bool error () const = 0;
};
struct Child : Base {
virtual bool error () const {
std::cerr << "Child::error ()\n";
return true;
}
};
int
main (int argc, char *argv[])
{
Child ch1, ch2;
; ch1 && ch2;
}
Base ::operator&& ()
Child::error ()
Child::error ()
<强>输出强>
{{1}}
答案 1 :(得分:2)
你似乎错误地认为纯虚函数意味着什么。
“纯虚拟性”意味着子类必须实现基类的所有虚函数
不,纯虚拟性要求子类覆盖特定的函数。非纯函数不必被覆盖,当然不能被声明为final
。