友元

c++设计一个不能被继承的类,为什么必须是虚继承?原因分析

房东的猫 提交于 2019-12-10 17:55:13
用C++实现一个不能被继承的类(例1) #include <iostream> using namespace std; template <typename T> class Base{ friend T; private: Base(){ cout << "base" << endl; } ~Base(){} }; class B:virtual public Base<B>{ //一定注意 必须是虚继承 public: B(){ cout << "B" << endl; } }; class C:public B{ public: C(){} //继承时报错,无法通过编译 }; int main(){ B b; //B类无法被继承 //C c; return 0; } 类Base的构造函数和析构函数因为是私有的,只有Base类的友元可以访问,B类在继承时将模板的参数设置为了B类,所以构造B类对象时们可以直接访问父类(Base)的构造函数。 为什么必须是虚继承(virtual)呢? 参见 c++Primer 4th 第17.3.7节 特殊的初始化语义 通常每个类只初始化自己的直接基类,但是在虚继承的时候这个情况发生了变化,可能导致虚基类被多次初始化,这显然不是我们想要的。(例2: AA,AB都是类A的派生类,然后类C又继承自AA和AB,如果按之前的方法会导致C里面A被初始化两次