继承类

继承方法

三种数据成员

1. public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用

2. private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。

3. protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。

三种继承方法

不可见的意思:子类继承父类所有的成员,即还是占用子类内存的,但是不能访问父类的私有成员。

特殊成员函数的继承

析构函数的调用顺序与构造函数的调用顺序相反。

构造函数

基类的构造函数不能被继承的原因如下:

1. 构造方法的方法名与类名必须一样,父子类不能同名,故不能继承,更不可能被重写派生类;

2. 构造函数和成员函数存在区别:构造函数用于创建新的对象,而其他成员函数是被现有的对象调用。

子类构造函数会调用父类构造函数

 子类隐式调用父类构造函数:的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数;

 子类显式调用父类构造函数 :fish():animal(400,300),c(100){}。

析构函数

首先给出结论:在不了解原理的情况下,析构函数写成虚函数一定不会出错。

delete指向子类的基类指针:释放子类和基类内存;

delete指向基类的基类指针:只释放基类内存。

虚析构函数

不管指针指向的是base还是derived,都是先执行子类析构,再执行父类析构。

原理解释:

内存分配


如图actress继承自sensei,当子类中有与父类同名的虚函数时,会修改父类中对应虚表项地址;当子类中有新的不同名的虚函数时,会在虚表后添加一项。



虚表的用途

实现动态多态

哪些函数不能定义为虚函数?

1)友元函数,它不是类的成员函数

2)全局函数

3)静态成员函数,它没有this指针

3)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数)

比如工厂模式

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。