vue做网站看不到htmI吗,本地网站asp iis,网站搭建h5是什么,网站运营推广方案设计一、菱形继承的基本概念 菱形继承又称为钻石继承#xff0c;由公共基类派生出多个中间子类#xff0c;又由多个中间子类共同派生出汇聚子类。汇聚子类会得到#xff0c;中间子类从公共基类继承下来的多份成员。
菱形继承的格式#xff1a; A --------公共基类/ \…一、菱形继承的基本概念 菱形继承又称为钻石继承由公共基类派生出多个中间子类又由多个中间子类共同派生出汇聚子类。汇聚子类会得到中间子类从公共基类继承下来的多份成员。
菱形继承的格式 A --------公共基类/ \B C ------- 中间子类\ /D --------汇聚子类
示例 #include iostream
using namespace std;//封装公共基类 家具 类
class Jiaju
{
private:string color;
public://无参构造Jiaju() {cout 家具的无参构造函数 endl;}//有参构造Jiaju(string n):color(n){cout 家具的有参构造函数 endl;}
};//中间子类
//封装 沙发的类
class Sofa:public Jiaju
{
private:string sitting;
public://无参构造Sofa() {cout 沙发的无参构造 endl;}//有参构造函数Sofa(string s,string c):Jiaju(c),sitting(s){cout 沙发的有参构造 endl;}void display(){cout sitting endl;}
};//中间子类
//封装 床 类
class Bed:public Jiaju
{
private:string sleep;public://无参Bed() {cout 床的无参构造 endl;}//有参Bed(string s,string c):Jiaju(c),sleep(s){cout 床的有参构造 endl;}void display(){cout sleep endl;}
};//汇聚子类
//封装 沙发床类 继承于沙发 和 床
class Sofa_Bed:public Bed,public Sofa
{
private:int w;
public://Sofa_Bed(){cout 沙发床的无参构造 endl;}//有参构造Sofa_Bed(string sit, string s, int w,string c):Bed(s,c),Sofa(sit,c),w(w){cout 沙发床的有参构造 endl;}
};int main()
{
// Sofa_Bed s;Sofa_Bed s1(可坐,可躺,123,pink);return 0;
}
菱形继承存在的问题 汇聚子类会得到中间子类从公共基类继承下来的多份成员造成空间浪费没有必要还会对公共基类的成员多次初始化或释放。
二、虚继承 虚继承的作用 可以让汇聚子类只保留一份 中间子类从公共基类继承下来的成员。 虚继承的格式 在中间子类的继承方式前 加上 virtual
class 类名 : virtual 继承方式 类名 //中间子类
{中间子类的拓展;
};
使用虚继承的注意事项 中间子类虚继承公共基类后汇聚子类的初始化列表先调用中间子类的有参构造函数中间子类再调用公共基类的有参构造函数。但是虚继承之后只保留一份中间子类从公共基类继承下来的有参构造函数意味着不知道调用哪一个中间子类继承下来的公共基类的构造函数这样就会默认调用公共基类的无参构造函数。 如果汇聚子类想要对公共基类的数据成员初始化需要显性调用公共基类的构造函数。
示例
#include iostream
using namespace std;//封装公共基类 家具 类
class Jiaju
{
private:string color;
public://无参构造Jiaju() {cout 家具的无参构造函数 endl;}//有参构造Jiaju(string n):color(n){cout 家具的有参构造函数 endl;}
};//中间子类
//封装 沙发的类
class Sofa:virtual public Jiaju //中间子类虚继承公共基类
{
private:string sitting;
public://无参构造Sofa() {cout 沙发的无参构造 endl;}//有参构造函数Sofa(string s,string c):Jiaju(c),sitting(s){cout 沙发的有参构造 endl;}void display(){cout sitting endl;}
};//中间子类
//封装 床 类
class Bed:virtual public Jiaju //中间子类虚继承公共基类
{
private:string sleep;public://无参Bed() {cout 床的无参构造 endl;}//有参Bed(string s,string c):Jiaju(c),sleep(s){cout 床的有参构造 endl;}void display(){cout sleep endl;}
};//汇聚子类
//封装 沙发床类 继承于沙发 和 床
class Sofa_Bed:public Bed,public Sofa
{
private:int w;
public://Sofa_Bed(){cout 沙发床的无参构造 endl;}//有参构造Sofa_Bed(string sit, string s, int w,string c):Jiaju(c),Bed(s,c),Sofa(sit,c),w(w) //需要在汇聚子类中显性调用公共基类的有参构造函数{cout 沙发床的有参构造 endl;}
};int main()
{
// Sofa_Bed s;Sofa_Bed s1(可坐,可躺,123,pink);return 0;
}