“final”的方法:省略“virtual”
Recipe for `final`: omit `virtual`?
如果我写final
(对成员函数),就不应该写virtual
,这是一个有效的配方吗?
在基类中,final
方法没有意义:
struct Driver {
virtual void print();
};
如果将final
添加到print()
,这将首先违背多态性的原因。因此,这将是无用的(尽管可能)。
当我从这个类派生时,我可以用 final
检测错误,但只有没有 virtual
:
struct KeyboardDriver : public Driver {
virtual void prynt() final; // Oops: typo, but compiler-ok
};
struct MouseDriver : public Driver {
void prynt() final; // Error: Hooray, compiler found my typo
};
KeyboardDriver::prynt
的附加final
是合法的。因为final
只要求成员函数为virtual
——编译器让它通过(FDIS 9.2p9)。
但是当我省略virtual
时,错别字使该函数成为非虚函数——它没有覆盖任何内容,即没有虚函数。因此,没有virtual
的final
在这方面的作用与override
相同。
更新:我的分析正确吗?没有virtual
的final
的功能是否包括override
的功能?
你的分析是正确的。不将final
成员标记为virtual
可以避免声明一个新的、未重写的成员并捕获错误。然而,由于这是override
的目的,使用final override
可能更简单;那么成员是否被标记为virtual
就无关紧要了。
这不是final
的作用。你要找的是override
。
struct Base {
virtual void print();
};
struct Derived : Base {
void prynt() override; //compiler error
};
struct Good : Base {
void print() override; //no compiler error
};
如果你将一个函数标记为override
,而它不是,那么你会得到一个错误。结合您的最终函数,您将获得编译器检查安全性的所有舒适,并且在编码标准要求时显式标记函数virtual
的清晰度。
struct Best : Base {
virtual void print() final override;
};
我不认为这是一个错误,它只是一个虚函数,不能重载。如果函数在父类中声明为虚函数,也会发生同样的事情,因为虚声明是继承的。禁止它是没有意义的。
我的分析正确吗?没有virtual的final的功能是否包括override的功能?
。这是一个编译器错误的原因:
void prynt() final; // Error: Hooray, compiler found my typo
是因为final
只允许在虚函数上使用。编译器报错,因为你在一个非虚函数上使用了它。
这一行没有语法错误:
virtual void prynt() final; // Oops: typo, but compiler-ok
这可能不是你想要的,但这是合法的(甚至是有意义的,取决于具体情况)代码。
你遇到的问题是由于想要这样做:
struct Driver {
virtual void print();
};
struct MouseDriver : public Driver {
void print();
};
省略virtual
在技术上是合法的。但就我个人而言,我一直觉得这是一种糟糕的形式。将重要信息(这些函数将被覆盖)放入另一个类中。我认为这是一个错误,甚至允许编译。
virtual
,并在您打算创建新函数的地方使用override
。那么,这将无法正确编译。
struct Driver {
virtual void print();
};
struct MouseDriver : public Driver {
virtual void print() override;
};
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 是否可以防止省略聚合初始化成员?
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- C++复制字段省略
- C++:右值引用构造函数和复制省略
- MSVC 杂注警告省略 CPP 文件中的'default'
- 为什么使用 QString::right 在字符串开头省略逗号?
- 在 qml 中多行时省略文本
- 在基类中调用的 VIrtual 基函数,C++
- 在临时将成员带出时省略复制/移动
- C++类:virtual和override,或者两者都没有
- 省略函数原型中的返回类型
- 将参数的省略复制为返回值
- 编译器确定参数是给定还是省略
- 在子类函数覆盖中省略具有默认值的参数
- g++ [[noreturn]] on a virtual method
- 在发送源代码时省略未使用的boost src文件的策略
- WTSFreeMemory在启动期间从服务调用时挂起-我应该省略吗
- “final”的方法:省略“virtual”