【1701H1】【穆晨】【171123】连续第四十四天总结

本文探讨了C++中多重继承带来的冲突问题及其解决方案,包括如何使用作用域运算符来区分同名成员以及如何通过虚基类解决继承路径上的重复问题。此外,还介绍了虚基类构造函数的调用顺序。

任务:冲突

冲突主要有两种情况:

(1)来自不同基类的同名成员同时出现在派生类中

来自不同类的同名成员可以用“类名::”加以区分

从类A中继承而来的同名成员可以用“A::同名成员”表示

(2)从基类继承来的成员与派生类中的新增成员同名

此时直接使用的成员是派生类中新增的同名成员//支配原则

而对基类中继承来的同名成员应使用作用域运算符

如从A类继承了y,则表示为“A::y”

class A{

protected:

    int x,y;

public:

{}

};

class B{

protected:

   int x;

public:

{}

};

class C:public A,public B{

   int y;

void show(){

     cout<<"A::x"<<A::x<<"\tB::x"<<B::x<<'\n';

     cout<<"A::y"<<A::y<<"\tC::y"<<C::y<<'\n';

虚基类:

同一个基类经过多级继承出现用“类名::”无法解决的冲突

此时在虚拟继承时,将共同基类设置为虚基类

定义格式:

class 派生类名:virtual 派生方式 基类名

    新增成员列表

class 派生类名:派生方式  virtual  基类名

    新增成员列表

虚拟继承的构造函数:

从虚基类直接或间接继承的派生类构造函数的头部,必须列出虚基类构造函数的调用,除非虚基类有缺省的构造函数

调用时,虚基类构造函数的调用先于非虚基类构造函数的调用

class A{

protected:

      int a;

public:

     A()

{

函数体

}

};

class B:public virtual A{//虚基类定义

protected:

     int b;

public:

     B():A()//虚基类的直接派生类的构造函数,列出虚基类构造函数的调用

{

函数体

}

};

class C:virtual public A{

protected:

   int c;

public:

   C():A()//虚基类构造函数的调用

{

函数体

}

};

class D:public B,public C{

    int d;

public:

    D():B(),C(),A()//虚基类的间接派生类的构造函数,列出其基类和虚基类构造函数的调用

{

 函数体

}

};

……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值