当实例化是可能的,但在c++中不能继承时

When the instantiation is possible but iheritance is not in C++

本文关键字:c++ 不能 继承 但在 实例化      更新时间:2023-10-16

在c++中,当你有一个类型,它可以被实例化,但有一个限制,不允许你从那个类继承,以增加一些功能时,可以使用Decorator软件设计模式。

我的问题是:在c++中,我可以有一个类的实例,但不能从同一个类继承的情况是什么?

如果你的c++编译器是c++ 11兼容的,你可以声明类为final,使类不可继承:

class A final
{
};

如果你不能访问支持final关键字的编译器,那么你必须使构造函数私有并使用静态工厂方法:

class A
{
    A() {}
public:
    A createA() { return A(); }
};

在c++ 03中可以使用一个技巧来避免需要工厂:

struct Final;
struct FinalHelper {
    friend struct Final;
  private:
    FinalHelper() {}
    ~FinalHelper() {}
};
struct Final : private virtual FinalHelper {
    Final() {}
};

这实际上并不能阻止某人使用Final作为基类,但它确实阻止他们构造或销毁他们的派生类。原因是派生最多的类负责构造和销毁虚基,而FinalHelper的构造函数和析构函数在派生最多的类中是不可访问的,除非它是Final

当然,这可能有运行时内存成本(对于虚拟基地)。

通常这样的把戏是没有意义的。c++依赖于程序员阅读文档,因此内置的final机制是可以的,但是您不想仅仅为了强制文档而产生运行时成本(对于虚基)或可用性成本(对于工厂函数,因为类型只能是复制构造的,这例如会影响它与某些容器成员函数的使用)。

因此,类型应该记录它们是否打算用作基类,而忽略文档的用户只能怪他们自己。