【发布时间】:2015-07-14 07:39:24
【问题描述】:
C++11 引入了关键字final 来禁止未来的覆盖或禁止继承。可以使用它的最常见示例是用于不打算用作基类的类(例如具有非虚拟析构函数)的情况。但是,有时我们可能希望在两个类之间建立 is-implemented-in-terms-of 关系(即private 继承),而不是 is-a关系(public 继承)。但是,final 禁止这两种继承。
我的问题如下:有没有办法允许private 继承但禁止public 继承(可能不是直接的,但至少我们可以“模拟”它)?在这种情况下,即使我们使用带有非虚析构函数的类也不会有任何问题,因为我们不能通过指向基的指针直接使用派生类,所以我们应该没问题。
我正在考虑这样的代码:
class Base /*final*/ {}; // making it final prohibits both private and public inheritance
class PrivateDerived: private Base{}; // this should work
class PublicDerived: public Base{}; // this shouldn't
int main()
{
PrivateDerived prvd;
PublicDerived pubd; // this should not compile
// Base* pBase = new PrivateDerived; // doesn't work, so we are ok
}
【问题讨论】:
-
受保护的默认(其他)构造函数。
-
@DieterLücking 或析构函数,但这可能会更棘手。
-
@DieterLücking 即使我将
Base中的ctor 设为受保护,class PublicDerived: public Base{};行仍然可以编译,因为派生类“知道”如何构造基础。事实上,整个程序都可以编译。而且有问题的Base* pBase = new PrivateDerived;仍然可以。 -
这是一个 XY 问题吗?
-
我的后备大脑中潜伏着一些关于重构
friend接口的东西,并且只使用protected构造,但是现在给出答案太模糊了,需要另一个级别的解耦一个简单的继承。 @MustafaOzturk 提案朝着这个方向发展,尽管我的意思是参考。
标签: c++ c++11 inheritance