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

非虚基类的虚拟派生类

好的,我将为您回答这个问答内容。

问题:非虚基类的虚拟派生类是什么?

答案:非虚基类的虚拟派生类是指在 C++ 中,不是在基类中声明和定义的虚拟类。这些虚拟类继承自一个基类,但它们本身并不继承自任何类。相反,它们是通过在原有基类的基础上扩展功能来实现的。这些虚拟类具有一个指向基类的指针,并且可以在运行时动态地确定要使用哪个基类。

名词解释

  1. 虚拟类:在 C++ 中,虚拟类是指可以在运行时动态地确定要使用哪个基类的类。
  2. 非虚基类:不是虚拟类的基类。
  3. 虚拟派生类:继承自非虚基类的虚拟类。

分类

  1. 按是否使用关键字 virtual 区分:
    • 虚基类:使用 virtual 关键字声明的基类。
    • 非虚基类:不使用 virtual 关键字声明的基类。
  2. 按实现方式区分:
    • 动态绑定:通过虚函数实现,在运行时根据对象的实际类型选择调用哪个函数。
    • 静态绑定:通过非虚函数实现,在编译时根据对象的实际类型选择调用哪个函数。

优势

  1. 代码复用:虚拟派生类可以在多个非虚基类之间共享代码,提高代码复用性。
  2. 运行时多态:虚拟派生类可以实现运行时多态行为,根据对象的实际类型选择调用哪个函数。
  3. 扩展性:虚拟派生类可以方便地扩展基类的功能,而不需要修改原有代码。

应用场景

  1. 当需要在基类的基础上扩展功能,但不希望影响原有代码时,可以使用虚拟派生类。
  2. 当需要实现运行时多态行为时,可以使用虚拟派生类。
  3. 当需要在多个非虚基类之间共享代码时,可以使用虚拟派生类。

推荐的腾讯云相关产品和链接

  1. 腾讯云 C++ SDK:<https://cloud.tencent.com/document/product/248/56941
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

7210

派生类

1.什么是?   在面向对象设计中,被定义为包含所有实体共性class类型,被称为“”。-百度百科   简单理解,即父(相对派生类) 2.什么是派生类?   ...利用继承机制,新可以从已有的中派生。那些用于派生称为这些特别派生出”。   简单理解,即子类(相对) 3.两者关联   派生类是一个相对关系。...派生类反映了继承关系,是相对而言又称父,是被派生类继承派生类又称子类,是从一个已有基础上创建,新包含所有成员,并且还添加了自己成员。...4.实际例子   假设有两个A和B,A和B都需要实现一个打印功能,原始做法是A写一个打印函数,B也写一个打印函数。两个还好可以写,但多了就特别麻烦。...这个时候我们就可以写一个C,C里面写一个打印函数。A和B分别继承C,这样A和B就不要写打印函数了。这样即节省了代码,又优化了结构。 上面的情况,C是A和B,A和B是C派生类

90440

c++-派生类

虚函数在重新定义时参数个数和类型必须和虚函数完全匹配,这一点和函数重载完全不同。...覆盖(Override)是指派生类中存在重新定义函数,其函数名、参数列、返回值类型必须同父相对应被覆盖函数严格一致,覆盖函数和被覆盖函数只有函数体 (花括号中部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中覆盖版本...覆盖特征有: 不同范围(分别位于派生类);2) 函数名字相同;3) 参数相同;4) 函数必须有virtual关键字。...隐藏是指派生类函数屏蔽了与其同名函数,规则如下: 如果派生类函数与函数同名,但是参数不同。此时,不论有无virtual关键字,函数将被隐藏(注意别与重载混淆)。...2) 如果派生类函数与函数同名,并且参数也相同,但是函数没有virtual关键字。此时,函数被隐藏(注意别与覆盖混淆)。

37720

派生类多态虚函数?

通常在层次关系根部有一个,其他则直接或间接继承而来,这些继承得到称为派生类负责定义在层次关系中所有共同拥有的成员,而每个派生类定义各自特有的成员。...成员函数与继承派生类可以继承其成员, 然而有时候派生类必须对其重新定义。派生类需要对这些操作提供自己新定义以覆盖从继承而来旧定义。...在C++语言中,必须将它两种成员函数区分开来: 一种是希望其派生类进行覆盖函数 另一种是希望派生类直接继承而不要改变函数。 对于前者,通常将其定义为虚函数(virual)。...派生类可以继承定义在成员,但是派生类成员函数不一定有权访问从继承而来成员。 和其他使用代码一样,派生类能访问公有成员,而不能访问私有成员。...现在,我们只需知道访问说明符作用是控制派生类继承而来成员是否对派生类用户可见。 如果一个派生是公有的,则公有成员也是派生类接口组成部分。

16420

c++继承 派生类 虚函数

参考链接: C++继承 继承    关系有组合、继承和代理。继承本质就是代码复用。子类继承父一些东西,父也称为,子类也称为派生类派生类继承了除构造函数以外所有成员。 ...中不同访问限定符下(public、protected、private)成员以不同继承方式继承,在派生类访问限定也不同,具体如下:  布局优先于派生类  #include<iostream...1.调用构造函数 2.调用派生类构造函数 派生类析构可想而知: 1.调用派生类析构函数 2.调用析构函数  虚函数  如下程序:  class Base { public:     Base...中含有虚函数,那么布局中存在一个虚函数指针,指向虚函数表;且其派生类中与其同名同参函数不需要加virtual也是虚函数。...此时派生类布局如下:     vfptr指针大小为4(32位机器)。因此字节数为8,派生类为12。

1K20

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

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

2.3K70

C++:43---派生类转换、静态动态变量

二、转换本质 派生类可以转换为本质是: ①为什么派生类可以转换为派生类而来,因此派生类中包含了方法和成员。...此时可以通过指针或引用指向派生类(相当于将派生类中继承那部分方法和成员绑定到上了,相当于派生类被截断了),然后就可以将派生类假装是一个对象来使用(调用其中成员/方法) ②为什么不能转换为派生类...如果将一个对象绑定到派生类指针/引用上,此时派生类通过指针/引用访问自己新定义成员/方法时,发现找不到(因此不能将转换为派生类) 例如:下面B继承于A,子类继承于父,同时为父成员开辟了空间...//假设B公有继承于A A *a; B b; a = &b; //将派生类转换为,正确 B *p = a; //将再转换为派生类,错误 五、静态类型/动态类型 在上面我们介绍过,指针或引用可以指向于对象也可以指向于派生类对象...,那么调用时候也取决于左边类型 转换之后,只能通过派生类访问属于自己(那一部分,而不能访问属于派生类数据成员(见下面演示案例③) 虚函数调用是个例外:虚函数调用是取决于指针或引用所指向类型

1.7K10

【c++】继承学习(一):继承机制与派生类转换

成员 派生类private成员 protected成员 派生类protected成员 派生类protected成员 派生类private成员 private成员 在派生类中不可见 在派生类中不可见...在派生类中不可见 private成员在派生类中无论以什么方式继承都是不可见。...继承,因为protetced/private继承下来成员都只能在派生类里面使用,实际中扩展维护性不强 2.派生类对象赋值转换 派生类对象可以赋值给对象 / 指针 / 引用...使用引用和指针时不会发生切片 对象切片问题仅在派生类对象被赋值给另一个类型对象时才会发生,比如当派生类对象被传值给一个对象函数参数,或者通过赋值构造一个新对象。...在使用引用或指针时,这种情况并不会发生 对象不能赋值给派生类对象 指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须是指针是指向派生类对象时才是安全

31510

C++核心准则​讨论:将析构函数设为公共和虚拟,或受保护非虚拟

也就是说,是否应该允许通过指向指针进行销毁?如果是,则base析构函数必须是公共才能被调用,否则虚拟调用它会导致未定义行为。...否则,应该对其进行保护,以便只有派生类才能在自己析构函数中调用它,这个析构函数也应该是非虚,因为它不需要虚拟地运行。...这种情况导致较早编码标准对所有析构函数都必须是虚拟提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当析构函数是公共时,才将它们虚函数化。...析构可以看作只是另一种操作,尽管具有使非虚调用变得危险或错误特殊语义。因此,对于析构函数,选择是根据是否允许通过指向Base指针实际上调用它。“非虚”不是一种选择。...因此,如果可以调用(即是公共析构函数,则它是虚拟,否则是非虚拟

1.1K20

CWnd派生类-3、CDialog

对话框与普通窗口区别仅在于,对话框是通过对话框模板建立起来。...而对于普通窗口,窗口及其包含子控件必须逐一创建,而且要指定窗口风格等详细参数。对话框是最基本可视化编程方法,一个应用程序往往包含众多对话框资源模板和封装,而普通窗体(包括框架窗体)却寥寥无几。...但对话框使用,只是方便了窗体和控件创建过程,其本质与普通窗体无任何区别。 下面并不准备陈述对话框技术细节,只与读者讨论两个相关问题:一是模态对话框消息循环,二是对话框命令消息路由。...但如果此时已经打开了两个以上主窗体,只能禁止模态对话框所在主窗口及其子窗口,包括主窗口下属弹出对话框,但不包括下属重叠窗口和普通弹出窗口。...7.4.1 模态对话框创建与模式循环 其实,“模态”并不是对话框专利,模态特性是封装在CWnd中。所以,如果采取与模态对话框相同创建方法,普通窗体也可以是模态

1.2K30

浅谈C#中new、override、virtual关键字区别

在本文中,只具体介绍new作为修饰符作用,在用作修饰符时,new关键字可以在派生类中隐藏方法,也就说在使用派生类方法是调用方法是New关键字新定义出来方法,而不是方法。...在不使用New关键字来隐藏方法也是可以,编译器会出现一个警告,提示如果有意去隐藏方法,请使用New关键字修饰。     这里有个注意事项就是New和Override这两个关键字是互斥。...二、Override     Override关键字主要是提供派生类方法新实现,重写方法必须和Override方法具有相同签名,此关键字不可以用于重写非虚方法和静态方法,与其配套使用关键字是..."); } } 此demo运行结果;     这是新方法     这是虚方法 三、 Virtual Virtual 关键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟...四、总结     New关键字主要用来区别派生类类同名方法选择问题,通过隐藏方法,达到使编译器调用正确方法目的。Override主要用来对方法和虚方法进行重写。

1.2K10

C++虚拟继承与虚

多重继承使得派生类关系变得更为复杂,其中一个容易出现问题是某个沿着不同路径被派生类继承(即形成所谓“菱形继承”),从而导致一个派生类对象中存在同一个对象多个拷贝。...(2)被虚拟继承,叫做虚。虚实际指的是继承方式,而非一个,是动词,而非名词。 (3)为了实现虚拟继承,派生类对象大小会增加4。...这个增加4个字节,是因为当虚拟继承时,无论是单虚继承还是多虚继承,派生类需要有一个虚表来记录虚继承关系,所以此时子类需要多一个虚表指针,而且只需要一个即可。...(4)虚拟继承中,虚对象是由最远派生类构造函数通过调用虚构造函数进行初始化派生类构造函数成员初始化列表中必须列出对虚构造函数调用;如果未列出,则表示使用该虚缺省构造函数。...因为虚拟继承只是表名某个对象在派生类对象中只被构造一次,而在本例中Student和Employee对象在EGStudent对象中本来就不会被构造多次,所以不将它们申明虚也是完全可以

88120

实例讲解override和new区别

一、override:Override关键字主要是提供派生类方法新实现。 1、不可以用于重写非虚方法和静态方法 2、与其配套使用关键字是Virtual、abstract、Override。...---- 二、new:new关键字可以在派生类中隐藏方法,也就说在使用派生类调用方法是New关键字新定义出来方法,而不是方法。...在不使用New关键字来隐藏方法也是可以,编译器会出现一个警告,提示如果有意去隐藏方法,请使用New关键字修饰。...可以对虚方法、普通方法进行操作 ---- 三、Virtual:允许在派生类中重写这些对象,默认情况下,方法是非虚拟,不可以重写。...In B c.Func(); // 执行c.Func:1.先检查申明A 2.检查到是虚拟方法 3.转去检查实例C,无重载 4.转去检查CB,有重载 5.执行父B中Func方法 5

887100

1小时深入c++面向对象编程

图4-7 继承访问能力(续) 4.2.6 派生类关系 1派生类具体化是对若干个派生类抽象,而派生类具体化;抽取了它派生类公共特征,而派生类通过增加行为将抽象变为某种有用类型...只对紧随其后名起作用 例如:class D:virtualpublic A,private B,virutalpublic C 其中,A和C是虚,而B是非虚 4.4.1 虚非虚存储结构...图4-16 虚非虚存储结构 4.4.2 虚构造函数 派生类中只有一个虚子对象 虚构造函数必须只被调用一次,目的是要保证虚子对象只被初始化一次 最派生类:继承结构中建立对象时所指定...虚子对象由最派生类构造函数通过调用虚构造函数进行初始化 在一个成员初始化列表中出现对虚和对非虚构造函数调用时,虚构造函数先于非虚构造函数执行 最派生类构造函数成员初始化列表中必须给出对虚构造函数调用...图4-17 虚构造函数 4.4.3 示例 ? 图4-18 虚非虚 4.4.4 小结 ? 图4-19 初始化顺序 传送门:1小时精通c++面向对象编程

60820

C#中Abstract 、Virtual和Override使用

1. abstract 修饰符指示所修饰内容缺少实现或未完全实现。 abstract 修饰符可用于、方法、属性、索引器和事件。在声明中使用abstract修饰符以指示某个只能是其他。...虚拟成员实现可由派生类重写成员更改。调用虚方法时,将为重写成员检查该对象运行时类型。将调用大部分派生类该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟。...由 override 声明重写方法称为重写方法。重写方法必须与 override 方法具有相同签名。不能重写非虚方法或静态方法。...4. base和this区别 1)base作用:用于从派生类中访问成员,调用上已被其他方法重写方法。指定创建派生类实例时应调用构造函数。...注:从静态方法中使用 base 关键字是错误。 2)区别: base 是子类中引用父,用于在派生类中访问重写成员。

1.2K20

c++头脑风暴-多态、虚继承、多重继承内存布局

其实在普通继承(非虚继承)时候派生类并不会重新生成虚表指针,只是会使用它自身虚函数地址去覆盖相同虚函数,如果是派生类独有的虚函数,则直接追加到虚函数表最后面。...总结一下:c++继承时多态一般指运行时多态,使用指针或者引用指向一个派生类对象,在非虚继承情况下,派生类直接继承虚表指针,然后使用派生类虚函数去覆盖虚函数,这样派生类对象通过虚表指针访问到虚函数就是派生类虚函数了...,也就是说,非虚继承时内存是按照继承顺序以及成员变量声明顺序来存储在前,派生类在后面。...,在64位系统中就是占用8个字节; 一个派生类非虚继承于一个有虚函数,不论派生类是否有同样虚函数,它内存布局都只是在有虚函数基础上增加派生类成员变量,虚表指针是直接继承,指向虚表指针...,如果派生类有同样虚函数,那就覆盖虚表中同名函数,如果是派生类独有的虚函数,那就追加在虚函数表后面; 一个派生类虚继承于一个有虚函数且没有成员变量,则派生类也不会生成它自己虚表指针和虚函数表

64820
领券