继承访问权限
父类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。
静态成员变量
- 遵循集成规则
- 使用前必须先定义
多继承产生的成员变量多义性
-
多个继承类继承自同一个祖先类,祖先类中的成员变量使用会产生二义性。如下:
#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关键字。
-
多个继承类中有同名的成员变量