您的位置:首页 > 编程语言 > C语言/C++

C++多态20160214

2016-03-16 15:11 309 查看
1.多态

指相同对象收到不同消息或不同对象收到相同消息时产生不同的动作

面向对象的三大特征:封装,继承,多态

2.

静态多态(早绑定):重载过程中

动态多态(晚绑定):以封装和继承为基础

3. 虚函数:用virtual修饰的成员函数

父类 *p = new 子类();这里p会调用父类的函数

在父类同名函数前面加virtual关键字,那么就能够通过指针调用子类的成员函数,从而实现多态

多态具体到语法中是指,使用父类指针指向子类对象,并可以通过该指针调用子类的方法。

4. 动态多态存在的问题就是内存泄露

构造函数中实例化一个对象,在析构函数释放内存

在动态多态中,我们通过父类指针指向子类对象,并且通过父类指针调用子类函数,但是delete对象的时候会出现问题,因为delete后面接父类,只能释放父类对象,而并没有释放子类(要是子类构造函数有申请堆内存)则会产生很严重的问题

virtual修饰析构函数-》虚析构函数

父类添加虚析构函数,会在delete的时候,先释放所指向的内容,再释放父类

5. virtual使用限制

1)不能是普通函数

2)不能修饰静态的成员函数

3)不能是内联函数

4)不能是构造函数

6. 虚函数和虚析构函数

虚函数:(在成员函数前面添加virtual关键字变成虚函数,使得父类指针能够调用子类函数)

指针指向对象,对象指针,指针指向函数,就是函数指针,指向函数入口

函数的本质就是一段二进制代码,写在内存当中。

函数指针与普通指针是一样的,只不过函数指针指向的是函数的地址

虚函数表指针:指向虚函数表(虚函数表占有一定的空间)父类的虚函数表的内容取决于虚函数。虚函数表中存放

子类:会继承父类的虚函数表,自己的虚函数表会指向父类的虚函数地址

也就是说在父类定义了虚函数,虽然父类和子类都有自己的虚函数表,但是虚函数地址不变。

7. 函数的覆盖与隐藏

父类子类出现同名函数,就会出现隐藏

要是子类没有定义父类的同名函数,那么子类相应的虚函数表会被父类的虚函数表内容覆盖

要是子类自己定义了同名函数,那么就会将父类的同名函数隐藏掉。

8. 虚析构函数,父类指针指向子类对象,delete父类的时候同时会delete子类

理论前提:执行完子类的析构函数就会执行父类的析构函数(系统自动)

父类定义虚析构函数会被系统默认继承到子类析构函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: