10. 继承
基类:base
派生类:derived
protected修饰的成员可以被类自身和派生类访问,类外不能访问
|
基类 |
子类是否可访问 |
类外是否可访问 |
|
public |
YES |
YES |
|
private |
NO |
NO |
|
protected |
YES |
NO |
构造时,基类先构造,派生类后构造。
析构时,派生类先析构,基类后析构。
数据隐藏:当子类含有和父类同名的成员时,访问子类自身的。
子类的指针或引用可以隐式转换为父类的指针或引用,反之则不可以。
class B {
public:
B() {
cout << "B()" << endl;
}
~B() {
cout << "~B()" << endl;
}
protected:
int age = 1;
int wage = 2;
};
class D :public B {
public:
D() {
cout << "D()" << endl;
age = 1;
wage = 100;//父类子类都有wage,由于数据隐藏,此处访问子类自身的
B::wage = 1000;//明确指出访问父类的
}
~D() {
cout << "~D()" << endl;
}
private:
int wage = 3;
};
int main() {
B b;
D d;
//b.age = 1;// 类外不能访问
//d.age = 2;// 类外不能访问
B *p1 = &d;//发生指针的隐式转换,因为子类中有父类需要的数据
//D *p2 = &b;//编译错误,无法确保父类中有子类需要的数据
return 0;
}
派生类d构造完成时的内存分布:前8字节是基类B的成员,接下来是d新增的成员。

继承:is A
组合:has A

浙公网安备 33010602011771号