gil*_*ash -1 c++ overriding final pure-virtual c++11
考虑派生类的基类,其中基类应该为其所有派生提供一些(多态)方法,例如armithmetic或bitweise重载运算符.派生类不应修改此操作以确保正确执行.但是,与此同时,我想进行评估 - 在我的示例中函数isError() - 运算符必须是子类和纯虚拟的,因此必须定义:
class Mom
{
public:
virtual bool operator && (const Mom&) const final
{
return this->isError() && p_rOther.isError();
}
private:
virtual bool isError() = 0;
};
Run Code Online (Sandbox Code Playgroud)
鉴于当前标准,似乎不允许这样做,因为"纯虚拟性"意味着子类必须实现基类的所有虚函数,而"final"关键字与此范例相矛盾.
任何建议或想法如何处理这个矛盾?
我假设你被误导了如何处理纯虚拟成员函数以及它们的用途.
只有声明为纯虚拟的 成员函数必须在从基类继承的类中定义.
我猜你是在混淆整个事物Base会变得抽象的事实.
在这篇文章中进一步向下的片段工作正常,并导致您描述的行为.虽然有virtual功能使其final失败了它的目的.
我建议你删除虚拟说明符.
这是除非你Base是从基继承其中的虚拟函数存在,并且你想搞清楚未来开发商阅读你的代码.
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
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;
}
};
Run Code Online (Sandbox Code Playgroud)
int
main (int argc, char *argv[])
{
Child ch1, ch2;
; ch1 && ch2;
}
Run Code Online (Sandbox Code Playgroud)
产量
Base ::operator&& ()
Child::error ()
Child::error ()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2934 次 |
| 最近记录: |