C++多态

多态原理

当类存在虚函数时,编译器会为该类维护一个表,这个表就是虚函数表(vtbl),里面存放了该类虚函数的函数指针。在构造类的时候增加一个虚表指针(vptr)指向对应的虚函数表。在类执行成员函数时候,先判断该函数是否是虚函数,如果不是虚函数则直接执行对应的方法,如果是虚函数则从虚函数表中找到应该调用的函数。

  • vptr的初始化是在类的构造时候完成。而在进行父类构造的时候,vptr指向的是父类vtbl。执行完子类的构造函数后,vptr在指向子类的btbl。
  • 父类指针(引用)指向子类进行多态调用时候,编译器并不关系是子类还是父类,而是通过vptr指向的btbl来找到对应的函数指针,并调用函数。
  • vtbl由编译器来维护

重载、覆盖、隐藏的区别和执行方式

4.1成员函数被重载的特征 (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 4.2“覆盖”是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual 关键字。 4.3“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,特征是:

(1)如果派生类的函数与基类的函数同名,但是参数不同,此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 (2)如果派生类的函数与基类的函数同名,但是参数相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

小结:说白了就是如果派生类和基类的函数名和参数都相同,属于覆盖,这是可以理解的吧,完全一样当然要覆盖了;如果只是函数名相同,参数并不相同,则属于隐藏。

示例

class Parent {
public:
    int x;

    Parent(int x) {
        this->x = x;
    }

     void print() {
        cout << "Parent " << x << endl;
    }
};

class Children : public Parent {
public:

    Children(int x) : Parent(x) {

    }

     void print() {
        cout << "Children " << x << endl;
    }
};

int main() {
    Parent *parent = NULL;
    Parent p(1);
    Children c(10);
    parent = &p;
    parent->print();
    parent = &c;
    parent->print();
}

测试一运行结果,发现虽然父类指针或引用指向了子类,但是在调用方法时候还是调用的父类的方法

Parent 1
Parent 10

测试二,对print方法加上virtual关键字,这时才体现出多态

Parent 1
Children 10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习实践二三事

python基础----函数作为返回值

从一个例子讲起 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 还是考虑这个问题:对可变参数进行求和 看了上一讲的已经知道,可以使用’*’...

29550
来自专栏小白的技术客栈

Python基础语法-内置数据结构之列表

列表特性总结 列表的一些特点: 列表是最常用的线性数据结构 list是一系列元素的有序组合 list是可变的 列表的操作, 增:append、extend、in...

39450
来自专栏塔奇克马敲代码

第 14 章 重载运算与类型转换

25360
来自专栏C++

python笔记:#013#高级变量类型

16830
来自专栏desperate633

LintCode 数组划分题目分析代码

给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:

6710
来自专栏WindCoder

《简明 Python 教程》学习笔记-运算符与表达式

又两天没更新了,暂且同步两篇之前的笔记。运算符与表达式这一块感觉主要就是运算符与它们的用法以及优先级了。

11620
来自专栏Golang语言社区

【Go 语言社区】Go语言数组

Go编程语言提供称为数组的数据结构,其可存储相同类型的元素的一个固定大小的连续集合。数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合。...

366150
来自专栏转载gongluck的CSDN博客

python笔记:#013#高级变量类型

高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (in...

35790
来自专栏我和PYTHON有个约会

10.程序编程基础4~变量&运算符

3.3 变量部分 3.4 运算符部分;主要讲解:赋值运算符、算数运算符、关系运算符、逻辑运算符、成员运算符、标识运算符

7210
来自专栏C语言及其他语言

【编程经验】关于数组指针与指针数组的解释

啦啦啦啦,小编又来了呢,今天给大家讲讲数组指针与指针数组,依旧废话不多说,直接步入正题。 关于数组指针和 指针数组,相信狠很多同学对此疑惑过,今...

29150

扫码关注云+社区

领取腾讯云代金券