三、C++面向对象-多态(Polymorphism)

C++ 面向对象(四)—— 多态 (Polymorphism) 为了能更好的理解本节内容,你需要清楚的知道怎样使用指针pointers 和类之间的继承 inheritance between classes。建议如果你觉得以下这些表达式比较生疏的的话, 请复习指定的章节: int a::b(c) {}; // 类Classes (Section 4.1) a->b // 指针和对象pointers and objects 阅读详情

多态概念

对于同一个行为,对于不要的对象,有不同的表现

具体就是去完成某个行为,当不同的对象去完成时会产生不同的状态

通俗就是多种形态

多态分类

  1. 静态多态(静态绑定)

    在程序编译结束后就已经明确了需要调用的函数

  2. 动态多态(动态绑定)

    在运行时才确定具体需要调动的函数

绑定:奖变量和函数名转换成地址的过程

绑定作用:把不同的派生类对象都当作基类对象看,可以屏蔽不同子类对象之间的差异;提高程序的通用性来适应需求的不断变化

虚函数

目的:通过基类访问派生类定义的函数

语法:

  1. 使用virtual关键字声明的函数
  2. 非类的成员函数不能定义为虚函数
  3. 类的静态成员函数不能定义为虚函数
  4. 构造函数不能定义为虚函数
  5. 当将基类的某一成员函数声明成虚函数后,派生类的同名函数自动成为虚函数
class Person
{
public:
	//虚函数
	//virtual 在类中使用,类外定义不能加
	virtual void getTicket()
	{
		cout << "100%票价" << endl;
	}
};

class Student : public Person
{
public:
	//继承之后也是虚函数
	//override关键字明确表示该函数覆盖了基类的虚函数
	//override只能在类中声明使用,类外定义不能加
	void getTicket() override
	{
		cout << "80% 票价" << endl;
	}
};

说明符final 与 override

final:

功能:指定某个虚函数不能在子类中被重写,或者某个类不能被子类继承

使用方法:

  1. 在类上使用:希望某个类不能被其他类继承

    class Base final
    {
    public:
    	void show()
    	{
    		cout << "Base class" << endl;
    	}
    };
    
    //编译出错,因为Base是final,不能被继承
    //class Derived : public Base{};
    
  2. 在类上使用:希望某个虚函数不能在派生类中被重写

    class Base
    {
    public:
    	virtual void show() final
    	{
    		cout << "Bash show" << endl;
    	}
    };
    
    class Derived : public Base
    {
    public:
    	//会编译报错,因为show在Base中被标记未funal,不能被重写
    	//void show() override
    	//{}
    };
    

使用场景:final关键字主要用于那些你不希望被进一步修改或扩展的类或成员函数

override

功能:明确指示一个成员函数覆盖(override)基类中的虚函数。有助于提高代码的可读性和安全性,因为可以避免在子类中意外地隐藏基类中的虚函数

使用:

class Base
{
public:
	virtual void show()
	{
		//基类
		cout << "Base show" << endl;
	}
};

class Derived : public Base
{
public:
	//使用override关键字:覆盖Base中的show()
	void show() override
	{
		//派生类实现
		cout << "Derived show" << endl;
	}
};

注意点:

如果在基类中的函数不是虚函数,即使在派生类中使用override关键字,编译器也不会报错。这是因为C++允许非虚函数的隐藏(hiding),而不是覆盖。为了避免这种情况,应确保基类中的函数是虚函数

动态多态

实现:

  1. 创建两个类,并且是继承关系
  2. 基类中的函数声明未virtual函数,也就是虚函数
  3. 派生类继承基类并重写基类中的虚函数
  4. 通过基类的指针或者引用访问派生类的对象

例外:

  1. 析构

    如果不构成多态,那么指针什么类型就会调用什么类型的析构函数,这也就导致:如果派生类的析构函数中有资源要释放,而这里却没有释放掉那些资源,就会导致内存泄漏的问题

  2. 协变

    重写的虚函数,返回值可以不同,但是返回值必须是父、子类的指针或引用类型, 即为协变

#include <iostream>

using namespace std;

class Person
{
public:
	Person()
	{
		cout << "Person constructor" << endl;
	}
	virtual ~Person()
	{
		cout << "Person destructor" << endl;
	}
    //虚函数
    //virtual 在类中使用,类外定义不能加
    virtual void getTicket();
};

class Student : public Person
{
public:
	Student()
	{
		cout << "Student constructor" << endl;
	}
	~Student()
	{
		cout << "Student destructor" << endl;
	}
    //继承之后也是虚函数
    //override关键字明确表示该函数覆盖了基类的虚函数
    //override只能在类中声明使用,类外定义不能加
    void getTicket() override;
};

void Person::getTicket()
{
    cout << "100%票价" << endl;
}

void Student::getTicket()
{
    cout << "80%票价" << endl;
}

int main(int argc, const char *argv[])
{
    Person p;
    p.getTicket();
    cout << "-----------" << endl;
    Student s;
    s->getTicket();
    cout << "-----------" << endl;

    //通过基类的指针访问派生类对象:调用的是派生类的getTicket()函数
    Person *pp = &s;
    pp->getTicket();
    cout << "-----------" << endl;
    //通过基类的引用访问派生类对象:调用的是派生类的getTicket()函数
    Person &rs = s;
    rs.getTicket();

    return 0;
}

成员函数的覆盖(重写)

覆盖指的是在派生类中重新定义基类中已经定义的函数。
在派生类中,使用相同的函数名、参数列表和返回类型来重新定义基类的函数
这样做可以使派生类对象在调用这个函数的时候执行自己的版本

特点:

  1. 不同的作用域(分别位于派生类与基类)
  2. 函数名相同
  3. 参数相同
  4. 返回值相同
  5. 基类必须有virtual关键字,不能有static
  6. 重写函数的权限访问限定符可以不同
#include <iostream>

using namespace std;

class Base
{
public:
    virtual void func()
    {
        cout << "Base func" << endl;
    }
};

class Derived : public Base
{
public:
    //重写
    void func() override
    {
        cout << "Derived func" << endl; 
    }
};

int main(int argc, const char *argv[])
{
    Base *ptr = new Derived();
    ptr->func();
  
    return 0;
}

成员函数的隐藏

隐藏是指当派生类中的函数与基类中的函数名称相同,但参数列表不同(不论是否使用virtual),或者即使参数列表相同但基类中的函数没有被声明为虚函数时,派生类中的函数会隐藏(Hide)所有基类中同名的函数

特点:

  1. 基类与派生类有同名函数,调用的时候总是调用子类的函数,此时父类成员函数被隐藏
  2. 不在同一作用域(分别位于派生类与基类)
  3. 函数名相同
  4. 返回值可相同可不同
  5. 参数不同时,无论有无virtual关键字,基类函数将被隐藏(注意与重载的区别)
  6. 参数相同时,但基类没有virtual关键字,基类的函数将被隐藏(注意与覆盖的区别)
#include <iostream>

using namespace std;

class Base
{
public:
    void func()
    {
        cout << "Base func" << endl;
    }
};

class Dervied : public Base
{
public:
    //隐藏了Base中的func函数
    void func()
    {
        cout << "Dervied func" << endl;
    }
};

int main(int argc, const char *argv[])
{
    Dervied obj;
    obj.func();
  
    return 0;
}

成员函数的重载

重载是指在同一作用域内,使用相同的函数名,但是参数列表不同的多个函数
C++允许通过参数列表的不同来定义多个同名函数,这样可以根据传入的参数类型或数量来决定调用哪个函数

特点:

  1. 同一个作用域
  2. 函数名相同
  3. 返回值可以相同也可以不同
  4. 参数列表不同
#include <iostream>

using namespace std;

class Base
{
public:
    void func()
    {
        cout << "Base func" << endl;
    }
};

class Dervied : public Base
{
public:
    //隐藏了Base中的func函数
    void func()
    {
        cout << "Dervied no arg func" << endl;
    }

    //重载了Dervied类中的func函数
    void func(int a)
    {
        cout << "Dervied one arg func" << endl;
    }
};

int main(int argc, const char *argv[])
{
    Dervied obj;
    obj.func();
  
    return 0;
}

重写与隐藏的区别

子类对象:子类对象在调用的时候,总是调用子类实现的成员函数

父类对象:

重写:用父类的指针或引用指向子类对象的时候,覆盖的情况下,父类指针或引用调用的函数是子类实现的函数

隐藏:用父类的指针或引用指向子类对象的时候,隐藏的情况下,父类指针或引用调用的函数是父类实现的函数

多态原理

C++中多态的核心原理是通过虚函数表(vtable) 和虚函数指针(vptr) 实现的动态绑定机制。这种机制允许在运行使根据对象的实际类型调用正确的函数实现

虚函数表(vtable)

每个包含虚函数的类(或继承自包含虚函数的类)在编译时会生成一个虚函数表

该表是一个函数指针数组,储存该类中所有虚函数的实际地址(包括继承和重写的虚函数)

虚函数指针(vptr)

每个对象在内存中会包含一个隐藏的指针(vptr),指向其所属类的虚函数表

vptr的初始化:在对象构造时,有构造函数隐式设置

单继承:

class Base {
public:
    virtual void func1() {} 
    virtual void func2() {}
    int a;
};

class Derived : public Base {
public:
    void func1() override {} // 重写 func1
    virtual void func3() {}  // 新增虚函数
    int b;
};

内存布局示例

Base对象:
-----------------		-----------------
| vptr(Base)	|  --> 	| &Base::fun1	|
| int a			|		| &Base::fun2	|
-----------------		-----------------

Derived对象:
-----------------		---------------------
| vptr(Deriver)	|  --> 	| &Derived::fun1	|
| int a			|		| &Base::fun2		|
| int b			|		| &Dervied::fun2	|
-----------------		--------------------- 

Derived的虚函数表包含重写的fun1、继承的fun2和新增的fun3

Derived对象中的vptr指向自己的虚函数表

动态绑定过程

当通过基类指针或引用调用虚函数时,编译器生成代码实现动态绑定:

  1. 通过对象的vptr找到对应的虚函数表
  2. 根据函数在虚函数表中的偏移量(由编译时确定)找到函数地址
  3. 调用该地址对应的函数
Base *obj = new Derived();
obj->func1();//实际调用Derived::func1()

obj的vptr指向Derived的虚函数表

虚函数表中func1的偏移量为0,对应Derived::func1的地址

多继承下的虚函数表

对于多继承,虚函数表的组指更为复杂

每个基类可能拥有独立的虚函数表,派生类会合并这些表,并处理可能的冲突

class Base1 {
public:
    virtual void f1() {}
};

class Base2 {
public:
    virtual void f2() {}
};

class Derived : public Base1, public Base2 {
public:
    void f1() override {}  // 重写 Base1::f1
    virtual void f3() {}   // 新增虚函数
};

对象内存布局

Derived 对象:
------------------	   -------------------
| vptr(Base1)	 | --> | &Deriver::f1	| //Base1 的虚函数表
| Base1 members	 |     -------------------
------------------
| vptr(Base2)	 | --> | &Base2::f2		| //Base2 的虚函数表
| Base2 members	 |	   -------------------
| Derived members|
------------------

Deriver对象包含两个vptr,分别对应Base1和Base2的虚函数表

Deriver::f1替换Base1虚函数表中的f1

Deriver::f3可能添加到Base1或Base2的虚函数表中,具体由编译器决定

虚函数表的实现细节

  1. 虚函数表的创建时机

    编译时:编译器为每个包含虚函数的类生成虚函数表,存储在程序的只读数据段(.rodata)

    运行时:对象构造时,构造函数负责初始化vptr指向正确的虚函数表

  2. 虚函数表的内容

    虚函数表中按声明顺序存储虚函数地址

    若派生类未重写某个虚函数,表中保留基类函数的地址

  3. 虚函数的调用代价

    直接调用开销:需通过vptr查找虚函数表,再通过偏移量获取函数地址

    缓存不友好:虚函数可能分散在内存中,导致缓存未命中

虚函数与普通成员函数的区别

特性虚函数普通成员函数
调用方法动态绑定(通过vptr查询)静态绑定(直接地址调用)
内存开销每个对象多一个vptr无额外开销
性能略低(间接调用)更高
覆盖行为可被派生类覆盖(override)可隐藏(hide),不可覆盖

纯虚函数(Pure Virtual Function)

纯虚函数是一种特殊的虚函数,他在基类中声明但不提供实现,强制要求派生类必须提高

语法:

virtual 返回类型 函数名(参数) = 0;

特征:

  1. 纯虚函数没有函数体,仅提供接口声明
  2. 派生类必须实现所有纯虚函数,否则派生类也会成为抽象类

抽象类(Abstract Class)

抽象类是包含至少一个纯虚函数的类

特征:

  1. 不能直接实例化,只能通过派生类创建对象
  2. 用于定义接口规范,强制派生类实现特定行为

抽象类的内存布局与虚函数表

class Base1 {
public:
    virtual void f1() = 0; // 纯虚函数
};

class Base2 {
public:
    virtual void f2() = 0; // 纯虚函数
};

class Derived : public Base1, public Base2 {
public:
    void f1() override {}  // 实现 Base1 的纯虚函数
    void f2() override {}  // 实现 Base2 的纯虚函数
};

对象内存布局

Derived 对象:
------------------	   -------------------
| vptr(Base1)	 | --> | &Deriver::f1	| // 实现纯虚函数
| Base1 members	 |     -------------------
------------------
| vptr(Base2)	 | --> | &Dervied::f2	| // 实现纯虚函数
| Base2 members	 |	   -------------------
| Derived members|
------------------

纯虚函数在虚函数表中的表现:

若基类的虚函数是纯虚函数,派生类必须提供实现,否则派生类仍为抽象类

虚函数条目:

纯虚函数在基类虚函数表中通常指向一个占位符(如编译器生的错误处理函数),直到派生类覆盖它

抽象类的核心规则

  1. 无法实例化

  2. 派生类必须实现所有纯虚函数

  3. 抽象类可以由非虚函数和成员变量

  4. 抽象类的构造函数和析构函数

    构造函数:可以定义,用于初始化成员变量

    析构函数:必须声明为虚函数,确保正确释放资源

抽象类的应用场景

  1. 定义接口规范
  2. 多态容器
  3. 模板方法模式

纯虚函数 vs 普通虚函数

特征纯虚函数普通虚函数
实现要求派生类必须覆盖派生类可选覆盖
基类是否提供实现否(C++11后允许提供默认实现)是
类是否可实例化包含纯虚函数的类是抽象类可以实例化
典型用途强制接口规范提供默认行为,允许派生类扩展
六、多态(Polymorphism) 例如,甲乙丙 3 个班都是高二年级,他们有基本相同的属性和行为,在同时听到上课铃声的时候,他们会分别走向 3 个不同的教室,而不会走向同一个教室。又如在 winows 环境下,用鼠标双击一个对象(这就是向对象传递一个消息),如果对象是一个可执行文件,则会执行此程序,如果对象是一个文本文件,由会启动文本编辑器并打开该文件。父类对象强转为子类对象后,访问从父类继承 下来的部分是可以的,但访问子类的部分,则会发生越界的风险,越界的结果是未知的。在替代之后,派生类对象就可以作为基类的对象使用。 阅读详情

相关推荐

【Codesys】-扫描添加失败,手动添加第三方模块,真·DC模式的高速计数模块

欧姆龙耦合器(NX-ECC201)和高速计数模块(NX-EC0132)单独使用。扫描设备添加到Codesys中,会报错,无法自动添加。记录一下,以防忘记。高速的计数保证了位置的准确性,位置准确就能保证裁切的精度,一切的基础就在这儿了,奈何目前只有欧姆龙和倍福能做到这样的波形。

qq_35316470的博客 1388

面向对象——多态

1. 多态概念        多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。        可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。 多态的主要用途 1、提高程序的可扩展性; 2、降低系统耦合度; 3

杨思默 3133

SpringAi 通过大模型来实现调用自己的Api

摘要 本文介绍了如何利用Spring AI的Tools机制扩展大模型能力,实现业务系统集成。通过@Tool和@ToolParam注解定义工具方法,将订单查询和关闭功能暴露给大模型调用。关键实现包括:1)使用详细描述标注工具方法和参数;2)在ChatClient中注册工具服务;3)集成对话记忆保持上下文。该方法使AI具备操作业务系统的能力,形成"认知-决策-执行"闭环,大幅提升了模型在实际业务场景中的应用价值。

又要搬砖了 835

面向对象-----多态

1、多态的概念 (1)多态是面向对象的一个重要特征,指同一类事物同时具有多种形态,即同一类事物,在不同时刻,代表的对象不一样,指的是对象的多种形态。比如,对于笔记本电脑,它可以是苹果笔记本、华硕笔记本、弘基笔记本、神州笔记本。 (2)多态就是同一个行为具有多个不同表现形式或形态的能力,指的就是行为的多态。比如鸟类的飞行行为,鸽子,燕子,老鹰它们各自的飞行方式是不同的,再比如动物都有吃这个功能,但是它们吃的食物是不同的,老虎吃肉,牛吃草,猫吃猫粮,狗吃狗粮。 (3)多态就是同一个接口...

qq_46652775的博客 6212

【SLG游戏服务器开发手册】(ROK Like)沙盘地图篇一,菱形瓦片与笛卡尔坐标系的转换(附调试工具)

轴向坐标:以菱形网格对角方向为基准轴,记作(q, r)菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)

代码时光 979

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6683

面向对象——多态详解

多态(Polymorphism)属于面向对象的三大特征之一,它的前提是封装形成独立体,独立体之间存在继承关系,从而形成多态机制。多态是同一个行为具有多个不同表现形式的能力。多态就是“同一个行为”发生在“不同对象上”会产生不同的效果。多种形态,多种状态,编译和运行有两个不同的状态编译期叫做静态绑定运行期叫做动态绑定现在我们再来回顾面向对象的三大特征:封装、基础、多态他们之间的关系是一环扣一环首先得封装成一个整体才有了继承的概念有了继承关系才有了多态的实现 ......

shouyeren_st的博客 1633

Python中的join函数的用法

从语法、实例、应用三方面详尽地介绍join函数

阿黎逸阳的博客 2万+

面向对象三大特性之一——多态详解

哈喽,小伙伴们大家好。上一章我们一起学习了继承,今天我们继续来学习面向对象三大特性中的最后一个特性——多态。事不宜迟,快拿起小本本,跟我一起开始吧。一、多态的概念多态,顾名思义,也就是多种状态。通俗点说就是不同的对象去干同一件事情时会产生不同的状态。以买火车票为例,普通人买票就要付全款,学生买票就可以出半价,军人虽然不能优惠但是可以优先买票。放到我们程序中就是不同继承关系的类对象去调用同一个函数,会产生不同的状态。在了解多态的构成条件前,我们先来了解一个概念,虚函数。在同一个作用域。......

weixin_59371851的博客 2422

从零开始讲DDR(5)——读懂Datasheet

对于开发人员来说,需要根据实际场景和使用的需要,使用不同厂家,不同型号的DDR,虽然原理上大同小异,但是还是有一些细节上的需要注意的地方,接触一个新的DDR芯片,首先就是需要找到对应的datasheet,而能都读懂datasheet,也是一个硬件工程师的必备技能。

apple_53311083的博客 5217

基于机器学习的电视剧类型点击量数据分析研究

1. 背景介绍 1.1 流媒体平台的兴起与电视剧市场的繁荣 近年来,随着互联网技术的飞速发展,流媒体平台如Netflix、Disney+、腾讯视频等迅速崛起,成为人们观看影视内容的主要渠道。电视剧作为流媒体平台上的重要内容类型,其点击量数据蕴含着丰富的用户偏好和市场趋势信息。

AI天才研究院 1049

面向对象的三大特性之——多态

多态的概念:通俗来说,就是多种形态,重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写,。重写的好处在于子类可以根据需要,定义特定 于自己的行为。也就是说子类能够根据需要实现父类的方法。父类子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型方法名(参数列表)要完全一致被重写的方法返回值类型可以不同,但是必须是具有父子关系的访问权限不能比父类中被重写的方法的访问权限更低。

qq_62712350的博客 1415

一篇把 Transport 做到可复制的实战指南:从 CTS 底层表到 LSMW、Variant、Layout、TABU、Query、SAPscript 全对象搬运

本文深入解析SAP系统中的Transport机制,将其视为可审计、可追溯的变更流水线。文章从CTS/Transport Organizer通用方法论和具体对象搬运手法两个层面展开,详细介绍了LSMW项目、程序Variant、屏幕/ALV Layout、表数据、ABAP Query、SAPscript和SO10标准文本等对象的传输策略。通过真实案例说明,代码对象往往能被正确传输,但"运行体验"和"业务配置"却常被遗漏,导致QAS测试正常而PRD环境异常。文章提供了一套可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 168

C++多态(Polymorphism)

1.多态的构成条件多态是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。必须指针或者引用调用虚函数被调用的函数必须是虚函数。说明:要实现多态效果,第⼀必须是基类的指针或引用,因为只有基类的指针或引用才能既指向派生类对象;第⼆派生类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多态的不同形态效果才能达到。2.虚函数。

TU^的博客 1674

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OOP 三大特征之多态(Polymorphism)

OOP三大特性最重要的:多态。 很多程序员虽然在用支持OOP的语言,但却从未用过多态。 只使用封装、继承的编程方式,称为基于对象(Object Based)编程 只有加入多态,才能称为OOP 没写过多态,就是没写过OO代码。 正是有了多态,软件设计才有更大弹性,更好拥抱变化。 如何理解多态? 多态,即一个接口,多种形态。 一个draw方法,以正方形调用,则画正方形;以圆形调用,则画圆形: 继承的两种方式之一的实现继承,请尽可能用组合替代。而接口继承,主要是给多态用的。 因为重点在于继承体系的使用者,主

JavaEdge全是干货的技术号 3596

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++ 中的多态性 (polymorphism) - Polymorphism in C++

C++ 中的多态性 (polymorphism) - Polymorphism in C++ ->Function Overloading (函数重载) ->编译时多态 (Compile time Polymorphism)-> ->Operator Over

程永强 1719

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ 多态性 (polymorphism)

C++ 多态性 (polymorphism). 多态性是什么以及如何帮我们实现一个易于扩展的程序.

我是小白呀的博客 4721

C++——Polymorphism 多态

多态,字面理解就是一个事物的多种形态。实际上是:不同的事物对同一行为做出的不同的反应。 C++中的多态:由继承而产生的相关的不同的类, 其对象对同一消息会作出不同的响应。 多态性是面向对象程序设计的一个重要特征, 能增加程序的灵活性。 可以减轻系统升级,维护,调试的工作量和复杂度。 1、赋值兼容 Assign Compatible 在需要基类对象的任何地方, 都可以使用公有派生类的对...

qq_41958529的博客 462

C++的多态(polymorphism)

基本定义:在C++中,多态(polymorphism)是一种面向对象编程(OOP)的特性,允许不同的类(通常是基类和派生类)使用相同的接口进行交互,但表现出不同的行为。

choose_heart的博客 376

【C++】多态(polymorphism)

指的是计算机自身彼此关联的过程,在这个过程中确定程序中的操作调用与之前操作的代码段之间的映射关系,比如:函数重载时,编译器会根据函数名和函数的参数来区别要执行的函数(哪一段代码) 这就是建立的一种映射关系,明确函数调用时会执行哪一个代码段。首先,我们需要额外的内存来存储V表,并且基类中要有一个成员指针指向V表,这样我们才能映射到正确的函数。指的是编译阶段不能确定将要调用的函数,只能在程序运行的时候才能确定将要调用的函数。这不是必需的,但你应该这样做。理解为,同一个接口,通过不同的对象调用,就有不同的效果。

qq_45951891的博客 1018

C++进阶-->多态(Polymorphism)

多态、虚函数、还有多态的底层讲解

2301_80475151的博客 1347

多态_polymorphism

自定义数据类型的转换,主要指类类型与其它数据类型之间的转换。(1)在C++中,把其它数据类型转换成类对象是通过转换构造函数来完成的,前提是此类的转换构造函数只带1个非缺省参数。(2)把类对象转换成其它数据类型是通过类型转换函数来完成的。类型转换函数又称为类型强制转换成员函数或转换运算符函数,他是类中的一个非静态成员函数。需要注意的是类型转换函数不能有返回值,不带任何参数,也不可以将类型转换函数定义为友元函数。classpublic:operator();

bliu2_10的博客 853

第八章聚焦于C++的多态(Polymorphism),这是面向对象编程(OOP)的三大特性之一(封装、继承、多态)

多态允许同一接口在不同对象上表现出不同行为,是C++面向对象编程的核心特性。本章介绍多态的实现、虚函数、抽象类、虚函数表等内容,为实现动态行为和设计模式奠定基础,同时与哈希表等数据结构的扩展性设计相关。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1175

多态(Polymorphism)

C++里多态的概念有点乱,有时间上Wikipedia上搜索了下相关词条,总结如下 Polymorphism(computer science) 在编程语言和类型理论中,Polymorphism(希腊语,意思为many shape)指的是单个接口对应多个类型实体。作为一个多态类型,它的操作(operation)也可以被提供给其他类型的value。存在几种完全不同类型的多态。 1

jinshandayouxia的专栏 1166

深入浅出面向对象核心:多态(Polymorphism)的机制与应用

多态”(Polymorphism)一词来源于希腊语,意为“多种形态”。在计算机科学中,它指的是同一个接口,使用不同的实例而执行不同操作的能力。换句话说,多态允许客户端代码面向抽象(如父类或接口)编程,而不必关心具体的实现(如子类)。动物大合唱。想象一下,你是一位动物园园长,你面前站着一只狗、一只猫和一只鸭子。你对它们发出了同一个指令:“叫一声!狗的反应是:“汪汪汪!猫的反应是:“喵喵喵!鸭子的反应是:“嘎嘎嘎!指令(接口/方法)是相同的:“叫一声”。执行者(对象)是不同的:狗、猫、鸭子。

2301_81154626的博客 1050

再谈 C++ 多态(Polymorphism)

文章目录多态的本质使用虚函数的例子:不带继承的多态:C++模板 多态的本质 个人的理解: 多态的本质是让我们得以用一种与类型无关(type-independent)的方式来操作这些类对象。 参考 Essential C++ P137 百度百科:在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。 使用虚函数的例子: #include <iostream>

weixin_47652005的博客 658
上一篇: 二、C++面向对象-继承(Inheritance)
下一篇: 零、C++基本语法
木子21
博客等级 码龄9年 58粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值