继承
我们发现,上面的这些下级成员都有上级成员的共性,还添加了自己的个性
这个时候就能利用继承的技术,减少重复的代码
语法
class 子类 : 权限 父类{ };
class son:public father{ };
class animal {
public:
int age;
};
class dog : public animal{//继承的语法
public:
string kind = "狗";
};
三种继承的方式
继承方式一共有三种
公共继承
保护继承
私有继承
如上图
A类的private私有权限,它的子类全部没法访问
若是以public方式继承,则除了父类的私有成员无法继承外,其他全部相同
若是以protected方式继承,则除了父类的私有成员无法继承外,其余继承的成员全部权限降级为protected
若是以private方式继承,则除了父类的私有成员无法访问,其余继承的成员全部权限降级为private
继承的对象模型
即继承父类的成员是否占用子类的类空间
父类无论什么权限的属性,只要是非静态的成员都会被子类继承拷贝,但是父类私有成员子类无法访问。
再加上子类的自身成员就是整体的子类对象模型
class father{
public;int a;
protect: int b;
private: int c;
};
class son:public father{//sizeof(son)=16
int d;
}
用vs自带的工具查看类
开始菜单找到VS的文件夹
进入后会有开发人员命令提示窗口
在里面跳转到要查看的类所在项目的文件夹
然后输入以下代码
cl /d1 reportSingleClassLayout<类> <文件名>
继承的构造函数和析构函数顺序
构造子类的时候会先构造父类,析构子类时会先析构子类
继承中同名的成员处理方式
访问子类成员,直接<子类>.<成员>
访问父类成员,则 <子类>.<父类>::<成员>
class animal {
public:
int num;
};
class dog : public animal{
public:
int num;
};
void main() {
dog p;
p.num = 10;
p.animal::num = 12;
}
继承中同名的静态成员处理方式
1、通过对象访问静态成员变量,与普通同名成员处理方式一样
2、通过类名直接访问
class animal {
public:
static int num;
};
class dog : public animal{
public:
static int num;
};
int dog::num = 10;
int animal::num = 11;
void main() {
cout<<dog::animal::num;//输出结果是11
}
多继承语法
class xixi :public dog, public animal//对处理两个父类中的同名成员,则需要加作用域进行分辨
菱形继承
现在假设基类中有一个成员age,那么羊就会有它自己的age,驼也会有自己的age
但是,草泥马就继承了两份age,这样会造成资源的浪费
所以就用virtual类对age进行修饰
```cpp
class animal {
public:
int age;
};
class yang :virtual public animal{
public:
static int num;
};
class tuo :virtual public animal {
};
class yangtuo :virtual public yang, virtual public tuo{};//这样yangtuo的age就是同一份