在C ++中,如果我有一个抽象基类,是否可以防止其派生类由基类知道的朋友以外的类实例化?
答案 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
,
但其他班级不知道它存在。
这种方式通常不太理想,因为派生类只能 用作不完整类型(转发)