写法: class 子类:继承方式 父类1,继承方式 父类2 ......
eg:class A:public B,public C {};
容易产生的问题:
当一个子类的几个父类中有重名成员时,这时候再通过子类的对象调用时就不能正常运行,原因很简单,因为编译器不知道调用哪个基类的成员。
举个例子:一个子类的基类1中含有m_a,子类二中也含有m_a,那么我通过子类对象调用的时候该调用哪个呢?这就产生了我们常说的二义性
解决方法:加上作用域解决。
#include<iostream>
using namespace std;
class Base1 {
public:
Base1()
{
m_A = 100;
}
public:
int m_A;
};
class Base2 {
public:
Base2()
{
m_A = 200;
}
public:
int m_A;
};
//语法:class 子类:继承方式 父类1 ,继承方式 父类2
class Son : public Base2, public Base1
{
public:
Son()
{
m_C = 300;
m_D = 400;
}
public:
int m_C;
int m_D;
};
//多继承容易产生成员同名的情况
//通过使用类名作用域可以区分调用哪一个基类的成员
void test01()
{
Son s;
cout << "sizeof Son = " << sizeof(s) << endl;
cout << s.Base1::m_A << endl;
cout << s.Base2::m_A << endl;
//如果直接写s.m_A,就会报错,原因就是产生了二义性,只有加上作用域才行
}
int main() {
test01();
system("pause");
return 0;
}
本文介绍了在C++中,当一个子类从多个基类继承时可能出现的成员变量同名问题,导致二义性。通过示例展示了如何通过作用域解析运算符来明确指定调用哪个基类的成员,从而解决这一问题。
1419

被折叠的 条评论
为什么被折叠?



