在c++中,可以防止派生类被友类以外的类实例化吗?

In C++, can I prevent derived class being instantiated by classes other than friends

本文关键字:实例化 派生 c++      更新时间:2023-10-16

在c++中,如果我有一个抽象基类,是否有可能防止它的派生类被基类知道的友类以外的类实例化?

您可以将构造函数定义为私有的,就像任何其他函数一样。例如:

class foo
{
friend foo *FooConstructor(void);
public:
  void Method();
  void Method2();
private:
  foo();
  foo(const &foo);
};
foo *FooConstructor(void) 
{ 
  return new foo(); 
}

这可以防止以任何方式创建foo,保存FooContructor函数

有两种方法可以在内部使用基类

第一个是使构造函数私有,像这样:
struct Sub1;
struct Sub2;
struct Base
{
    virtual ~Base() = default;
private:
    Base() = default;
    Base(const Base&) = default;
    friend struct Sub1;
    friend struct Sub2;
};
struct Sub1 : protected Base {}; // ok, its a friend
struct Sub2 : protected Base {}; // ok, its a friend
struct Sub3 : protected Base {}; // compiler error
第二种方法是在匿名命名空间中声明基类:
namespace {
    struct Base{};
}
struct Sub : Base {}; 

现在,同一翻译单元中的所有类都可以使用Base,但是其他类不知道它的存在。

这种方式通常不太理想,因为派生类只能用作不完整类型(转发)