2019-07-13 多态

多态


字面意思是多种状态。在多态里涉及两个定义。

  • 覆盖:即子类继承父类的同时重写了父类的函数,从而使父类中的同名函数,以子类重写的为准。前提条件,父类对应的函数为虚函数。
  • 隐藏:即子类继承父类的同时重写了父类的函数,但是父类中的同名函数,依然存在。只是子类默认调用的是重写的函数。但是父类的函数还是存在的,可以以别的方式调用。前提:父类对应的函数非虚函数。

多态的本质:在一个类中创建虚函数后,会产生一个虚表,虚表中存储者虚函数的地址,当重写虚函数时,虚表的地址会发生改变。

下面我写了一个简单的demo

#include<iostream>
using namespace std;
class CAnimal
{
public:
    virtual void Description();
    void Feature();
};
class CBird:public CAnimal
{
public:
    void Description();
    void Feature();
};
int main()
{
    CAnimal animal;
    CBird bird;
    CAnimal *panimal = NULL;
    panimal = &animal;
    panimal->Description();
    panimal->Feature();
    cout << "........................................." << endl;
    panimal = &bird;
    panimal->Description();
    panimal->Feature();
    cout << "........................................." << endl;
    animal.Description();
    animal.Feature();
    cout << "........................................." << endl;
    bird.Description();
    bird.Feature();
    cout << "........................................." << endl;
    getchar();
    getchar();
    return 0;
}

void CAnimal::Description()
{
    cout << "动物" << endl;
}

void CAnimal::Feature()
{
    cout << "我是有生命的" << endl;
}

void CBird::Description()
{
    cout << "鸟儿" << endl;
}

void CBird::Feature()
{
    cout << "我是有生命的鸟儿,我会飞" << endl;
}

执行结果如下:
动物
我是有生命的
.........................................
鸟儿
我是有生命的
.........................................
动物
我是有生命的
.........................................
鸟儿
我是有生命的鸟儿,我会飞
.........................................

用GDB调试查看虚表结果如下图所示:

1.png
2.png
3.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 继承和多态 1. 继承的优缺点 优点:(1)子类可以灵活地改变父类中的已有方法;(2)能够最大限度的实现代码重用。...
    MinoyJet阅读 729评论 0 0
  • 什么是多态性? 多态:相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。C++支持两种多态性:编译时多态...
    showaichuan阅读 653评论 0 3
  • 多态(1)静态多态与动态多态 什么是多态 从字面上理解就是多种形态的意思。而多态一词最初源自希腊语,其含义便是“多...
    kingZXY2009阅读 2,460评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,681评论 1 32
  • 可以将我们的人类文明过程抽象这样一个过程:获取数据、分析数据、建立模型、预测未知。 由此开始出现了『大数据』概念。...
    润一粟阅读 181评论 0 0

友情链接更多精彩内容