首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从基类访问派生的虚函数,这是很好的实践吗?

从基类访问派生的虚函数是一种常见的实践,它可以实现多态性和动态绑定的特性。通过基类指针或引用调用虚函数时,会根据实际对象的类型来确定调用的是基类还是派生类的虚函数,从而实现了运行时的多态性。

这种实践的优势在于:

  1. 灵活性:通过基类指针或引用调用虚函数,可以根据实际对象的类型来动态选择调用的函数,从而实现灵活的对象行为。
  2. 扩展性:当需要添加新的派生类时,只需要继承基类并实现相应的虚函数即可,不需要修改基类的代码,从而实现了代码的扩展性。
  3. 可维护性:通过使用虚函数,可以将相关的代码组织在一起,提高代码的可读性和可维护性。

这种实践在以下场景中特别适用:

  1. 多态性需求:当需要处理一组对象,这些对象可能属于不同的派生类,但又具有相同的基类接口时,可以使用基类指针或引用调用虚函数来实现多态性。
  2. 扩展性需求:当需要在现有的类层次结构中添加新的派生类,并且这些派生类需要具有与基类相同的接口时,可以使用虚函数来实现扩展性。

腾讯云提供了一系列与云计算相关的产品,其中与虚拟化和多态性相关的产品包括云服务器(CVM)和容器服务(TKE)。您可以通过以下链接了解更多关于腾讯云的产品信息:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

派生函数和非虚函数继承效果

函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、函数:   C++函数主要作用是“运行时多态”,父中提供函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯函数:   C++中包含纯函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯函数子类才能new出对象。   ...C++中函数更像是“只提供申明,没有实现”,是对子类约束,是“接口继承”。   C++中函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系中,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

8410

C++中派生成员访问形式

C++中派生成员访问形式主要有以下两种: 1、内部访问:由派生中新增成员对继承来成员访问。 2、对象访问:在派生外部,通过派生对象对继承来成员访问。...今天给大家介绍在3中继承方式下,派生成员访问规则。...private成员在私有派生中是不可直接访问,所以无论是派生成员还是通过派生对象,都无法直接访问继承来private成员,但是可以通过提供public成员函数间接访问。...private成员在私有派生中是不可直接访问,所以无论是派生成员还是派生对象,都无法直接访问继承来private成员,但是可以通过提供public成员函数直接访问它们。...private成员在私有派生中是不可直接访问,所以无论是派生成员还是通过派生对象,都无法直接访问private成员。

2.4K70
  • C++编程经验(2):为析构函数必要性

    这个要提一下,如果记不住就记住:如果不做析构函数,会有内存泄漏 解释 定义一个指针p,在delete p时,如果析构函数函数,这时只会看p所赋值对象,如果p赋值对象是派生对象,...就会调用派生析构函数;如果p赋值对象是对象,就会调用析构函数,这样就不会造成内存泄露。...如果析构函数不是函数,在delete p时,调用析构函数时,只会看指针数据类型,而不会去看赋值对象,这样就会造成内存泄露。 多少学点设计模式就清楚了。...接下来是一个子类 class Inherit :public Base{ //此处省去,一切从简 }; //重点看调用 int main() { Base *p = new Inherit; //这种方式调用...,这时候有没有析构就不一样了 delete p; Base *q = new Base; delete q; return 0; }

    58510

    从零开始学C++之继承(二):继承与构造函数派生转换

    一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生中需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...输出可以看出: 派生对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生对象成员构造函数,最后是派生自身构造函数。...初始化列表参数多个且其中有调用构造函数时,先执行构造函数最远开始,如果多重继承则按继承顺序);其他对象成员若不止一个,则按定义顺序构造,与初始化列表顺序无关。...向下转型不安全,没有自动转换机制 // 语法上来演示对象可以转化为派生对象,但是没有意义 1、转换构造函数: Manager(const Employee& other) : Employee

    1.5K00

    C++基础-多态

    编程实践:对于将被派生覆盖方法,务必将其声明为函数,以使其支持多态。 2. 析构函数 析构函数与普通函数机制并无不同。...编程实践:务必要将析构函数声明为函数,以避免派生实例未被妥善销毁情况发生。 3....// 访问派生覆盖函数(覆盖普通函数) d.B::func3(); // 访问函数 d.B::func4(); // 访问函数 d.B...可见使用继承可以解决多继承时菱形问题,确保 在继承层次结构中,继承多个同一个派生而来时,如果这些没有采用继承,将导致二义性。...• 派生中被声明为 override 函数是否是中对应函数覆盖?确保没有有手误写错。 编程实践:在派生中声明要覆盖函数函数时,务必使用关键字 override 7.

    85720

    再探函数

    2、纯函数是在中声明函数,它在中没有定义,但要求任何派生都要定义自己实现方法。在中实现纯函数方法是在函数原型后加"=0" 3、声明了纯函数是一个抽象。...(这句话刚开始还真没反应过来,也是啊,都不能初始化对象了,还怎么去调用方法啊) ---- Q3:抽象派生对象可以调用方法?...只有在析构函数定义为函数时,调用操作符delete销毁指向对象指针时,才能准确调用派生析构函数该级向上按序调用函数),才能准确销毁数据。...所以在调用析构函数时,派生对象数据成员已经销毁,这个时候再调用子类函数没有任何意义。 ---- Q8:静态函数能定义为函数?...每一个有函数(或有函数派生)都有一个函数表,该类任何对象中都放着该函数指针(可以认为这是由编译器自动添加到构造函数指令完成)。

    87020

    结合实例深入理解C++对象内存布局

    我们通过派生对象访问成员与直接使用对象访问时完全一致,一个派生对象前半部分就是一个完整对象。 对于成员函数(包括普通函数和静态函数),它们不占用对象实例内存空间。...不论是成员函数还是派生成员函数,它们都存储在程序代码段中(.text 段)。 带有函数继承 带有函数继承,稍微有点复杂了。...,如下图: 指针和引用在编译器底层没有区别,ref 和 ptr 地址一样,就是原来派生 derivedObj 地址0x7fffffffe360,里面的函数表指针指向派生函数表,所以可以调用到派生...而这里 dup 是通过拷贝构造函数生成,编译器执行了隐式类型转换,派生截断了部分,生成了一个对象。...dup 中函数表指针指向函数表,所以调用 printInfo。 从上面 dup 函数表指针输出也可以看到,函数表不用每个实例一份,所有对象实例共享同一个函数表即可。

    46821

    调用及其调用具体形式

    这是函数被“实调用”另一个例子。由于概念上说,在一个对象构造函数运行完毕之前,这个对象还没有完全诞生,所以在构造函数中调用函数,实际上都是实调用。...析构时,在销毁一个对象时,先调用该类所属析构函数,然后再调用其析构函数。所以,在调用析构函数时,派生已经被析构了,派生数据成员已经失效,无法动态调用派生函数。...3.调用常见形式 设立函数初衷就是想在设计时候,对该派生实施一定程度控制。笼统说,就是“通过访问派生成员”。...因此,调用最常见形式是:通过指向指针或引用来访问派生对象函数。这种情况较为常见。...不常见形式: 不过由于调用是通过查询函数表来实现,而拥有函数对象都可以访问道所属函数表,所以,一个不常见做法是通过指向派生对象指针或引用调用对象函数,考察如下代码。

    40310

    c++和继承面试点25连问

    ,先调用构造函数,再调用派生构造函数派生对象销毁时,先调用派生析构函数,再调用析构函数。...运行时多态简单来讲就是:使用指针或者引用指向一个派生对象,在非虚继承情况下,派生直接继承表指针,然后使用派生函数去覆盖函数,这样派生对象通过表指针访问函数就是派生函数了...因为销毁时候直接销毁指针,此时编译器只知道调用析构,并不会主动去调用派生析构函数,所以析构函数需为析构函数,这样运行时程序才会去调用派生析构函数,其实这就相当于析构函数多态,...这是因为成员函数实现机制,上题说了,成员函数跟某个对象无关,实际上它被编译后,我们可以把它理解为一个全局性函数汇编角度看,print函数被编译后真正函数名是_ZN7CPeople5printEv...同样,这段代码里面的CPeople就是抽象了,某个不论是自己定义了纯函数,还是其他继承了纯函数但却并没有实现,都可以称为抽象,所谓抽象,其实就是具体反义词,比方说这里只给了一个接口

    98010

    C++核心准则C.35:析构函数要么是公开函数,要么是保护非虚函数

    为了避免无定义行为。如果析构函数是公有的,那么调用侧代码就会尝试使用指针销毁派生对象,在析构函数为非虚函数时其结果时没有定义。...如果析构函数时保护,那么调用侧代码就无法通过类型指针销毁派生对象,这是析构函数就没有必要一定是函数。析构函数是保护而不是私有的,这样派生析构函数才能调用它。...函数定义了派生接口,它可以在不关注派生情况下使用。如果接口允许对象,那么这个销毁过程应该是安全。...我们可以想象一种需要保护函数析构函数情况:当希望允许派生对象(只有这个类型)通过指针销毁另外一个对象(不是它自己)时。但是我们还没有在实际开发中遇到这种情况。...拥有函数函数要么是公开函数,要么是保护非虚函数。 译者注:拥有函数一般就意味着它有派生

    1.1K20

    C++调用及其调用具体形式

    这是函数被“实调用”另一个例子。由于概念上说,在一个对象构造函数运行完毕之前,这个对象还没有完全诞生,所以在构造函数中调用函数,实际上都是实调用。...析构时,在销毁一个对象时,先调用该类所属析构函数,然后再调用其析构函数。所以,在调用析构函数时,派生已经被析构了,派生数据成员已经失效,无法动态调用派生函数。...3.调用常见形式 设立函数初衷就是想在设计时候,对该派生实施一定程度控制。笼统说,就是“通过访问派生成员”。...因此,调用最常见形式是通过指向指针或引用来访问派生对象函数。这种情况较为常见。...不过由于调用是通过查询函数表来实现,而拥有函数对象都可以访问到所属函数表,所以,一个不常见做法是通过指向派生对象指针或引用调用对象函数,考察如下代码。

    48830

    总结继承和多态一些问题

    不行,因为对象中函数表指针是在构造函数初始化列表阶段才初始化。 4.区分切片和派生生成 先来说派生生成步骤: ①先是继承了表,是把表拷贝下来了。...因此,简单总结就是:派生对象赋值给对象,切片会把派生中包含成员变量值拷贝过去,但是派生表不会给拷贝过去,则函数中这个对象表是,所以无法实现多态。...而指针或者引用是直接指向派生对象,不会进行拷贝赋值,这样函数表是派生函数表,故能实现多态。 5.inline函数可以是函数?...不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式无法访问函数表,所以静态成员函数无法放进函数表。 7.析构函数可以函数析构函数最好是函数。...因为有时候我们难免会用指针或引用指向派生对象,析构函数函数的话,可以准确地调用派生析构函数。 8.对象访问普通函数快还是函数更快? 首先如果是普通对象,是一样快

    45420

    C++三大特性之多态详解

    派生中有一个跟完全相同函数(即派生函数函数返回值类型、函数名字、参数列表完全相同),称子类函数重写了函数。...即函数返回对象指针或者引用,派生函数返回派生对象指针或者引用时,称为协变。...总结一下派生表生成:a.先将表内容拷贝一份到派生表中 b.如果派生重写了中某个函数,用派生自己函数覆盖表中函数 c.派生自己新增加函数按其在派生声明次序增加到派生最后...答:不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式无法访问函数表,所以静态成员函数无法放进函数表。 构造函数可以是函数?...继承对于相同在对象当中只会存储一份,若要访问成员需要通过表获取到偏移量,从而找到相应成员,解决了数据冗余和二义性问题。 什么是抽象?抽象作用?

    13910

    【C++】多态

    我们可以通过对比地址方式来确定位置,代码运行结果就可以看出,表地址和代码段地址较为相近,所以表位置极大可能性就是在代码段,另一方面去理解的话,函数本质不就是成员函数?...从下面的打印结果就可以验证派生函数放在第一张表里面,其实我们内存窗口也可以看出来第一张表里面放着派生自己函数,这些都没有什么问题。...重定义要求较为宽松,指的是在继承体系中,派生中出现同名函数情况,只要函数名相同就构成隐藏,在调用时,若不指定域,默认访问同名函数派生域,编译器就近原则,找近对于编译器来说比较轻松嘛...内存角度和语法角度来看,菱形继承分别带来了数据冗余和二义性问题,虚拟继承能够解决菱形继承原理即通过方式进行解决,内存中只存一份成员,腰部派生访问时通过自身成员模型中表来进行访问...,表中存放着腰部类到成员偏移量,如果腰部类想要访问成员时,则通过自身成员变量中表来进行成员访问,这便解决了数据冗余问题,在访问冗余数据时,也不会出现二义性了,无论你怎么访问

    54320

    【C++】三大特性之多态

    }; 3.函数重写(覆盖) 派生中有一个跟完全相同函数(即派生函数函数返回值类型、函数名字、参数列表完全相同) ,称子类函数重写了函数。...协变(派生函数返回值类型不同) 派生重写函数时,与函数返回值类型不同。即函数返回对象指 针或者引用,派生函数返回派生对象指针或者引用时,称为协变。...总结一下派生表生成: a.先将表内容拷贝一份到派生表中 b.如果派生重写了中某个函数,用派生自己函数覆盖表中函数 c.派生自己新增加函数按其在派生声明次序增加到派生最后...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 调用方式无法访问函数表,所以静态成员函数无法放进函数表。 3. 构造函数可以是函数?...答:可以,并且最好把析 构函数定义成函数。 5. 对象访问普通函数快还是函数更快?答:首先如果是普通对象,是一样快

    76550

    C++:继承与派生

    3、继承成员访问方式变化 总结: 1、private成员在派生中无论以什么方式继承都是不可见。...2、private成员在派生中是不能被访问,如果成员不想在外直接被访问,但需要在派生中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现。...派生构造函数必须调用构造函数初始化那一部分成员。如果没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用。 2....4、派生析构函数会在被调用完成后自动调用析构函数清理成员。因为这样才能 保证派生对象先清理派生成员再清理成员顺序。 5....这是为了后面的函数表做准备,用来存表找到函数偏移量(菱形继承多态)。在多态那一环节会去验证。 八、继承总结和反思 1. 很多人说C++语法复杂,其实多继承就是一个体现。

    14710

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——11.多态

    ):派生中有一个跟完全相同函数(即派生函数函数 返回值类型、函数名字、参数列表完全相同),称子类函数重写了函数。...协变(派生函数返回值类型不同) 派生重写函数时,与函数返回值类型不同。即函数返回对象指 针或者引用,派生函数返回派生对象指针或者引用时,称为协变。...总结一下派生表生成: a.先将表内容拷贝一份到派生表中 b.如果派生 重写了中某个函数,用派生自己函数覆盖表中函数 c.派生自己 新增加函数按其在派生声明次序增加到派生最后...静态成员可以是函数? 答:不能,因为静态成员函数没有this指针,使用类型::成员函数 调用方式无法访问函数表,所以静态成员函数无法放进函数表。 6. 构造函数可以是函数?...答:可以,并且最好把析 构函数定义成函数  8. 对象访问普通函数快还是函数更快? 答:首先如果是普通对象,是一样快

    8410

    【C++篇】继承之巅:超越法则束缚,领略面向对象至臻智慧

    1.1.1 友元函数定义 如果定义了一个友元函数,该友元函数只能访问私有和保护成员,而不能访问派生私有或保护成员。...反之,如果友元函数派生中定义,它也无法访问私有和保护成员。...消除访问二义性:通过表和指针,派生可以唯一地访问实例,消除了访问二义性问题。 2.5.2 缺点 内存开销增加:虚拟继承引入了表和指针,有时候增加了内存额外开销。...3.1.1 函数与多态 这里先大致看一下,之后会有专门讲解多态文章滴 在多态机制中,函数被声明为函数(virtual)后,派生可以对该函数进行重写(override)。...这种初始化顺序确保 A 实例在 B 和 C 之前就已经准备好。 3.2.2 成员访问 成员访问派生中可能需要显式地指定

    13210

    C++入门到精通(第九篇) :多态

    函数返回对象指针或者引 用,派生函数返回派生对象指针或者引用时,称为协变。...(派生析构函数名字不同) 如果析构函数函数,此时派生析构函数只要定义,无论是否加virtual关键字,都与 析构函数构成重写,虽然派生析构函数名字不同。...总结一下派生表生成:a.先将表内容拷贝一份到派生表中 b.如果派生重写了 中某个函数,用派生自己函数覆盖表中函数 c.派生自己新增加函数按其在 派生声明次序增加到派生最后...答:不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式 无法访问函数表,所以静态成员函数无法放进函数表。 构造函数可以是函数?...当指针指向new出来派生对象时候,需要使用指针进行释放对象,此时需要析构函数函数,保证指针指向对象成功释放 对象访问普通函数快还是函数更快?

    45630

    C++进阶:继承和多态

    _stuNum << endl; } 例如上面这串代码,注释掉那部分 就是错,因为友元函数无法访问派生保护或者私有成员。...函数重写 函数重写概念: 派生中有一个跟完全相同函数(即派生函数函数 返回值类型、函数名字、参数列表完全相同),称子类函数重写了函数。...函数重写两个例外 协变(派生函数返回值类型不同) 派生重写函数时,与函数返回值类型不同。...即函数返回对象指 针或者引用,派生函数返回派生对象指针或者引用时,称为协变。...override和final 这是两个关键字。 override: 用于表示一个函数(virtual function)在派生中重写了函数

    7510
    领券