在C ++中,我可以阻止派生类由除朋友之外的类实例化

时间:2015-06-10 03:01:55

标签: c++ oop

在C ++中,如果我有一个抽象基类,是否可以防止其派生类由基类知道的朋友以外的类实例化?

2 个答案:

答案 0 :(得分:7)

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

class foo
{

friend foo *FooConstructor(void);

public:
  void Method();
  void Method2();

private:
  foo();
  foo(const &foo);
};

foo *FooConstructor(void) 
{ 
  return new foo(); 
}

这样可以防止foo以任何方式创建,并使用FooContructor功能保存。

答案 1 :(得分:2)

有两种方法可以拥有基类内部

第一个是使构造函数私有,如下所示:

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, 但其他班级不知道它存在。

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