虚继承方法
template<class T>
class Q
{
friend T;
private:
Q()
{}
~Q()
{}
};
class A : virtual public Q<A>
{
public:
A()
{
cout<<"A()"<<endl;
}
~A()
{
cout<<"~A()"<<endl;
}
};
class B : public A
{
public:
}
int main()
{
B bb;
return 0;
}
解释:
如果去掉virtual,因为A是Q的友元类,所以可以访问Q的私有成员,B继承的是A,所以调用的是A的构造和析构函数。
如果加上virtual,A仍然调用的是Q的构造和析构函数,但B得先调用Q,由于B不是Q的友元类,所以不能调用Q的私有成员(构造和析构函数)