虚函数 纯虚函数 虚类

虚函数

类的某些函数,基类希望它的派生类各自定义这些函数各自的版本。
除了构造函数,任何函数都可以是虚函数。
让派生类继承借口和缺省定义(默认定义)。

定义&声明

class A
{
virtual int get(){};
};

class B:public A
{
int get() override
}

如果是普通的虚函数(不是纯虚函数),那么基类也是需要提供虚函数的定义的。
因为不是纯虚函数,那么该类就可以实例化,那就必须需要定义。
派生类必须在其内部重新定义的虚函数进行声明。

在基类中定义虚函数的时候需要在最开头加virtual

虚函数可以有默认实参,且派生类也可以定义不同的默认实参,但是最好相同。

重写

在子类函数重写的时候,可以选择加也可以选择不加virtual。同时,如果可以在最结尾的时候加override确认是重写。
在派生类中覆盖了某个虚函数时,可以再一次使用virtual指出该函数的性质,也可以不加。但一个函数被声明为虚函数时,在他的所有派生类中,都是虚函数。
重写时,虚函数的返回值,形参必须完全相同。

但是,当基类返回的是自己类型的指针时。那么气派生类可以修改虚函数的返回值,但必须是返回派生类自身类型的指针。

另外,在分离定义的时候,不能加virtual.

关键字

override

使用override关键字,用来确认定义的函数确实是覆盖了基类的虚函数,如果没有覆盖,那么编译时候会报错。

使用

类的函数成员分类

  1. 普通函数成员:基类希望其派生类直接继承,而不要改变的函数
  2. 虚函数:基类希望其派生类进行覆盖的函数。

普通虚函数,可以派生类可以不用重写。
纯虚函数,必须重写。

普通成员函数,其解析过程发生在编译时。
虚函数的解析可能在编译时,也可能是在运行时。
当通过指针或引用调用对象的虚函数时。那么函数会在运行时才会被解析。

这里解析的含义是,当对象调用自己的成员函数的时候,是执行自己的成员函数,还是执行其子类的成员函数。
当将一个派生类对象的指针或引用赋值给基类对象指针时(此时会发生派生类向基类的转化),在运行时解析。执行的是派生类的成员函数。

如果我们想回避虚函数的动态绑定机制,而直接运行派生类基类的成员函数。(调用的函数仍然是一个虚函数,只是我们希望调用基类的)。

pa->A::set();

显式的指定。那么函数将在编译时完成解析。

抽象基类

接口类

纯虚函数

纯虚函数的目的是为了让派生类只继承借口,不继承定义。所以必须要定义。

定义

class A
{
virtual int get()=0;
};

=0只能在类内出现。
同时仍然可以在类外提供这个函数的定义。唯一的调用方式是显式调用。
出纯虚函数可以不提供定义,因为这个类不能够实例化。但是可以定义指向这个类的指针。
同时这个类里面还是可以出现正常的虚函数,成员变量。

构造函数

派生类构造函数只初始化他的直接基类。也就是说派生类在构造函数中只能调用直接基类的构造函数,不能使用其间接基类的构造函数。

class C:public B
{
public:
  C():B(),A()
  {
  };
}

这里报错

 type 'A' is not a direct base of 'C'
  C():B(),A(){};

虚析构函数

任何函数,只要带有一个虚函数,那么他的析构函数必将是虚函数。

如果一个类的析构函数不是虚函数,那么不能将派生类向基类转化

如果say()函数不是虚函数

//忽略大部分
A *pa;
B *pb;
pa=pb;

pa->say();

执行的是类A的成员函数。

如果say()函数是虚函数,那么执行的是 类B的函数成员。

所以,如果基类的析构函数不是虚函数,那么我们使用上述的转化的时候,析构的将是类A的析构函数。
那么其派生类部分的成员将无法析构。

所以,析构函数必须是虚函数。

析构时,从最外层向基层依次执行析构函数.

构造函数和析构函数中不能使用虚函数

构造函数中,构造不完全,调用的是基类的函数.
同样析构时也一样。

对象构造期间,虚函数不是虚函数。所以调用不会出错,只是不知道会发生什么。
也就是说,派生类构造时,如果正处于基类构造函数执行期间,那么类型是基类类型,也就是说谁的构造函数在执行,那类型就是什么。
因为,如果将基类函数定义为虚函数。那么,无法初始化。编译会报错。

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

推荐阅读更多精彩内容