本质:代码的复用
class A {
public:
int ma;
protected:
int mb;
private:
int mc;
};
class B :public A {//公有继承 A:父类/基类 B:子类/派生类
public:
int md;
protected:
int me;
private:
int mf;
};
其中A有12个字节(三个整型成员变量),B有自己的三个成员变量和从A继承而来的三个成员变量,故有24个字节
从基类继承来成员时还附带了基类的作用域,因此可以有基类和派生类的同名成员,因为作用域不同
如何设计类与类间的关系
组合:a part of …
继承:a kind of …
public继承方式下
基类中成员\访问限定 | 基类的访问限定 | 派生类的访问限定 | (main)外部访问限定 |
---|---|---|---|
public | public | public | Y |
protected | protected | protected | N |
private | private | 不可见的 | N |
只有自己或友元可以访问私有成员。不可见:能继承来,但是无法访问
protected继承方式下
基类中成员\访问限定 | 基类的访问限定 | 派生类的访问限定 | (main)外部访问限定 |
---|---|---|---|
public | public | protected | N |
protected | protected | protected | N |
private | private | 不可见的 | N |
基类成员的访问限定在派生类中是不可能超过继承方式的
private继承方式下
基类中成员\访问限定 | 基类的访问限定 | 派生类的访问限定 | (main)外部访问限定 |
---|---|---|---|
public | public | private | N |
protected | protected | private | N |
private | private | 不可见的 | N |
默认的继承方式
class定义派生类,默认继承方式是private(class定义的类不写访问限定其成员默认也是私有)
struct定义派生类,默认继承方式是public(struct定义的类不写访问限定其成员默认也是公有)