最近在学习C++多继承语法的时候,想通过类访问子类同名成员的时候,出现了如下的错误:
具体代码如下:
#includeusing namespace std; //多继承语法 class base1 { public: base1() { m_A = 100; } int m_A; }; class base2 { public: base2() { m_A = 200; } int m_A; }; //子类 需要继承base1和base2 //语法:class 子类 : 继承方式 父类1,继承方式 父类2,... class Son :public base1, public base2 { public: Son() { m_C = 300; m_D = 400; } int m_D; int m_C; }; void test01() { Son s; cout << "sizeof Son=" << sizeof(s) << endl; cout << "base1的m_A=" << s.base1::m_A << endl; cout << "base2的m_A=" << s.base2::m_A << endl; //对象添加作用域 cout << "base2的m_A=" << Son::base2::m_A << endl; } int main() { test01(); return 0; }
经过多次搜索后,成功找到了解决方法:
报错原因:类的成员有两种:静态成员和实例成员(包括实例和函数)。
实例成员的存储空间属于具体的实例,不同实例(对象)的同名成员拥有不同的存储空间;静态成员的存储空间是固定的,与具体的实例(对象)无关,被该类的所有实例共享。
而我在代码中想访问的是非静态变量,使用了类访问:Son::base2::m_A ,因此会报错。
解决方法:1.将base2中的m_A由非静态变量改为静态变量static int m_A。
2.使用对象访问:Son s; s.base::m_A;
总结:访问静态成员变量
可以使用:Son::base2::m_A;
也可以使用:Son s; s.base2::m_A;
但最好使用前者方式访问,因为这样很容易判定成员是静态成员。
访问非静态成员变量
只能使用:Son s; s.base2::m_A;
不能使用:Son::base2::m_A;
本例就是使用了后者的方式访问非静态成员变量而报错。
欢迎一键三连!


