【发布时间】:2019-05-24 00:48:37
【问题描述】:
C++11 为 C++ 引入了final 关键字。
它可以用于虚方法或类。
声明一个最终类禁止任何类型的继承:公共的、受保护的和私有的。
struct A final {
};
class B: private A {
};
error: base 'A' ^ is marked 'final'
虽然禁止公共继承是合理的(例如,如果我的类没有虚拟析构函数,或出于其他原因),我为什么要禁止私有继承?
如果final 禁止只有公共继承,那么std::string 和它在std 中的其他朋友可能会是final -- 他们应该这样做 -- 因为没有虚拟析构函数?
编辑:
Howard Hinnant 已经回答了Why the standard containers are not final,但仍然有理由声明一个最终类但允许私有继承。
【问题讨论】:
-
没有虚拟析构函数无论如何都不会禁止或限制继承。它仅通过指向基类的指针使对对象的所有权出错。所以这不是制作
std::string和大多数其他库类final的原因。 -
这个假设的功能将如何工作?假设您可以从最终类派生(如果只是私下)。虚函数会被视为最终函数吗?