template<typename T>
class A
{
friend T;
private:
A(){}
~A(){}
};
class B:virtual public A<B>
{
public:
B(){}
~B(){}
class A
{
friend T;
private:
A(){}
~A(){}
};
class B:virtual public A<B>
{
public:
B(){}
~B(){}
};
由于B是A的友元类,因此在B中调用A的构造函数和析构函数都不会造成编译错误。但是其它的类C如果继承B类的话却不能被编译。因为B是从A虚继承过来的。在调用C构造函数时候会直接跳过B而直接调用A的构造函数。非常遗憾(窃喜),C不是A的友元类,因此不能调用A的私有构造函数。
基于以上分析,试图从B继承的类,一旦实例化都会导致编译错误,因此B不能被继承。