父类public | 父类protect | 父类private | |
---|---|---|---|
public继承 | public | protect | --- |
protect继承 | protect | protect | --- |
private继承 | private | private | --- |
先看继承的权限关键字,再看父类的成员变量声明关键字。
与构造函数执行顺序相反
class A中有x ;class B集成A,同时也有x。则b.x访问的是B中的x。如果要访问A中的x,则用b.A::x。
1.png
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A" << endl;
}
int x;
};
class B : public A {
public:
B() {
cout << "B" << endl;
}
};
class B1 : public A {
public:
B1() {
cout << "B1" << endl;
}
};
class C : public B, public B1 {
public:
C() {
cout << "C" << endl;
}
};
int main() {
cout << "A size=" << sizeof(A) << endl;
cout << "B size=" << sizeof(B) << endl;
C c;
// c.x;
return 0;
}
测试一运行结果:发现A类的构造函数调用了两次。
A size=4
B size=4
A
B
A
B1
C
测试二,把//c.x
的注释打开。运行报错,提示x不明确
error: request for member 'x' is ambiguous
解决办法,可以在集成B和B1的时候加上virtual关键字。
2.png