任务:冲突
冲突主要有两种情况:
(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()//虚基类的间接派生类的构造函数,列出其基类和虚基类构造函数的调用
{
函数体
}
};
……