C++总结之多态与虚函数

1.何为多态??多态的作用?
多态的概念:
一个接口,多种方法
多态的作用:
封装可以是得代码模块化;继承可以扩展已经存在的代码,都是为了代代码重用;
多态的目的:接口重用

2.静态联编和动态联编分别表示什么?
在编译的时候能够确定对象所调用的成员函数的地址则为静态联编;
动态联编:指的是在程序运行的时候动态地进行,根据当时的情况来确定调用哪个同名函数(父类指针指向哪个子类,就调用哪个子类的同名函数),实际上是在运行时虚函数的实现

3.类中有虚函数的时候,类有什么变化?
当类中存在虚函数的时候,这个类大小就增加4个字节,这4个字节是虚表指针,存放的是虚函数表的地址;
虚函数表其实是一个指针数组,它里面存放的其实是虚函数的地址

虚函数的几个知识点:

先看一个例子:

#include "stdafx.h"
#include <ostream>
#include <iostream>
using namespace std;

class CClassA {
public:
    virtual void fun_a() {
        cout << "fun:cclassA,这是类A里面的函数" << endl;
    }
};

class CClassB:public CClassA {
public:
    virtual void fun_a() {
        cout << "fun:cclassB,这是类B里面的函数" << endl;
    }
};

int main()
{
    CClassA objA, *pobjA;
    CClassB objB;
    pobjA = &objA;
    pobjA->fun_a();
    pobjA = &objB;//父类指针指向对象B,下面这个函数就是B里面的对象!!!
    pobjA->fun_a();
    return 0;
}


几个重点:

一个空类:一个字节
一个空类里面只有一个整型,此类大小:4个字节

  • 定义基类的公有派生类
  • 基类的公有派生类中重载该虚函数
  • 重载该虚函数不是一般的重载,它要求函数名,返回类型,参数个数,参数类型和顺序完全相同
  • 由于对虚函数进行了重载,派生类中的虚函数前的virtual关键字可以省略.
  • 父类虚表和子类虚表是2个独立的表(由于两个类之间有继承关系),故子类的虚表里面也有父类的虚函数指针,但是如果子类中有和父类中一样的函数名,那么子类中的虚函数就覆盖了子类虚表中所继承的父类虚函数地址;
  • 如果父类中有虚函数,子类中无虚函数,则子类也会生成一个虚表,(因为子类要继承父类的虚函数,但是虚函数又不能随便放,只能生成一个虚表出来!)(以上为个人理解,没有太大偏差,想要理解的更深一点,需要查看相关文献!!!)

4.纯虚函数是一种特殊的虚函数,是一种没有具体实现的虚函数

例子:
class  cclassA
{
virtual <函数类型><函数名>(<参数表>)=0;
}
  • 含有纯虚函数的类是抽象类,抽象类是不能定义对象的(不能实例化)
    含有纯虚函数的类---->抽象类------->不能定义对象!!!!!

  • 析构函数为什么要推荐设计为虚函数??
    首先,先了解一下构造函数的调用顺序:
    基类构造函数-->数据成员的构造函数->派生类构造函数
    执行派生类的析构函数,也需要调用基类以及子对象的析构函数,析构顺序如下:
    派生类析构函数-->数据成员类析构函数----->基类的析构函数
    正常情况下,一个子类被释放的时候,会主动调用其父类析构函数;使用父类指针指向子类对象的时候,只会析构掉父类对象,如果此时子类里有堆空间内存,则会造成内存泄露!(内存泄露是指使用malloc或者new申请内存空间之后,没有freeh或者delete掉,此时申请的那块内存仍然处于占用状态,称为内存泄露!)

故必须将析构函数定义为虚函数,这样释放父类指针的时候便会调用子类的析构函数,也会正常释放掉子类的堆空间!

看下面一个例子:

#include "stdafx.h"
class Base
{
public:
    Base() {
        printf("base 父类构造\n");

    };
    virtual ~Base() {                   //1th在此行加不加virtual有一定区别,而对于一般成员函数,基类中有虚函数,则子类中对应的成员函数不一定声明为虚函数,因为子类继承了父类 
        printf("Base 父类析构\n");
    };
    void fun() {                        //2th
        printf("父类base-fun\n");
    };
};
class son :public Base
{
public:
    son() {
        printf("son 子类构造\n");
    };
     ~son() {                                        //**
        printf("son 子类析构\n");
    }
    void fun() {                         //3th
        printf("子类son-fun\n");
    };
};


int main()
{
    Base *p; //父类指针

    son *pobj = new son; //走到这一步,会先调用父类构造,然后再调用子类构造,new 出子类对象指针,从堆空间中分配出来的,一般创建对象是在栈空间里面

    p = pobj;   //父类指针指向子类对象            
    p->fun();          //注意,这个例子里面函数不是虚函数,所以调用的函数皆为父类里面的函数!!!!!
    delete pobj; //通过父类指针释放子类对象

    
    return 0;
}


**处不管有没有virtual这个关键词,结果都如下:
(验证了上面所说的:如果父类中有虚函数,子类中无虚函数,则子类也会生成一个虚表)


image.png
  • 虚基类的目的是为了解决二义性问题,使用公共基类在其派生类对象中只产生一个基类子对象!!!!!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容