可以通过虚拟继承来实现此功能。
建立一个辅助类Assistant,不包含有任何数据,仅仅是将构造函数私有化,设置目标类TargetClass为友元类。让目标类TargetClass派生于辅助类TargetClass。如下:
class Assistant
{
friend class TargetClass;
private:
Assistant(){}
};
class TargetClass : public virtual Assistant
{
public:
TargetClass() : Assistant(){}
};
TargetClass是虚继承Assistant,所有的TargetClass及其派生类都要显式地初始化Assistant。又因为Assistant的构造函数是私有的,只能由TargetClass来构造。所以不能从TargetClass派生出任何类。
同理:若期望TargetClass只能被指定的类派生,也可以用这种方式来实现。例如:
class Assistant
{
friend class TargetClass;
friend class TargetClassEx;
private:
Assistant(){}
};
class TargetClassEx: public TargetClass
{
public:
void DoSomething(){}
};