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

从纯虚拟类(A)派生的指针无法从纯虚拟类(B)访问重载方法

从纯虚拟类(A)派生的指针无法从纯虚拟类(B)访问重载方法的原因是,纯虚拟类(A)和纯虚拟类(B)之间存在继承关系,但是纯虚拟类(A)并没有实现重载方法的具体实现,而是将其声明为纯虚函数。因此,纯虚拟类(A)的指针只能访问纯虚函数的声明,而无法访问具体的实现。

纯虚拟类是指包含至少一个纯虚函数的类,纯虚函数是在基类中声明但没有具体实现的虚函数。纯虚函数通过在函数声明后加上 "= 0" 来指定。

纯虚函数的存在使得基类成为抽象类,无法实例化对象。派生类必须实现纯虚函数的具体实现,才能被实例化。

在这种情况下,如果从纯虚拟类(A)派生出一个指针,该指针只能访问纯虚函数的声明,无法访问具体的实现。因此,无法通过该指针访问纯虚拟类(B)中的重载方法。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的MySQL数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接
  • 腾讯云人工智能平台(AI Lab):提供丰富的人工智能算法和工具,帮助开发者构建智能应用。产品介绍链接
  • 腾讯云物联网平台(IoT Hub):提供全面的物联网解决方案,支持海量设备接入和数据管理。产品介绍链接
  • 腾讯云移动应用开发平台(MPS):提供一站式移动应用开发服务,包括移动后端云服务、移动应用测试等。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++重要知识点小结---2

该声明是为派生而保留位置。 一个抽象不能有实例对象,即不能由该类抽象来制造一个对象。 虚函数是在基中为子类保留一个位置,以便子类用自己实在函数定义来重载之。...如果在基中没有保留位置,则就没有重载虚函数是一个没有定义函数语句虚函数,虚函数值是0.派生必须为每一个基虚函数提供一个相应函数定义。...2.派生可以继承基所有公有和保护数据成员和成员函数。 保护访问权限对于派生来说是公有的,而对于其它对象来说是私有的。即使是派生也不能访问私有的数据成员和成员函数。...在派生中允许重载成员函数。如果基函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向对象类型来调用派生函数。...也就是说子类把父私有变量也继承下来了,但是却无法访问,对于我这种菜鸟来说一下子没法转个弯来,后来看看资料焕然大悟,子类虽然无法直接访问私有变量,但是子类继承函数却可以访问,不然的话如果只继承函数而不继承变量

69170

C++ 重载运算符 继承 多态 (超详细)

=demo2; //派生对象可以初始化基引用; Base *Bpo=&demo2;//派生对象可以赋给指向基对象指针;//多态实现方法 主要是派生中一定包含基中所有成员,在使用中,一定可以找到对应成员...声明为指向基对象指针,当其指向公有派生对象时,只能用它来直接访问派生继承来成员,而不能直接访问公有派生定义成员。...1.虚函数是在基中声明虚函数,它在基中没有定义,但要求任何派生都要定义自己实现方法。...在基中实现虚函数方法是在函数原型后加“=0” virtual void funtion()=0 1、为了方便使用多态特性,我们常常需要在基中定义虚拟函数。...同时含有虚拟函数称为抽象,它不能生成对象。这样就很好地解决了上述两个问题。 注意含有虚函数,不能直接声明对象!!!!!!!!

1.1K21

C++重要知识点小结---2

该声明是为派生而保留位置。 一个抽象不能有实例对象,即不能由该类抽象来制造一个对象。 虚函数是在基中为子类保留一个位置,以便子类用自己实在函数定义来重载之。...如果在基中没有保留位置,则就没有重载虚函数是一个没有定义函数语句虚函数,虚函数值是0.派生必须为每一个基虚函数提供一个相应函数定义。...2.派生可以继承基所有公有和保护数据成员和成员函数。 保护访问权限对于派生来说是公有的,而对于其它对象来说是私有的。即使是派生也不能访问私有的数据成员和成员函数。...在派生中允许重载成员函数。如果基函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针所指向对象类型来调用派生函数。...也就是说子类把父私有变量也继承下来了,但是却无法访问,对于我这种菜鸟来说一下子没法转个弯来,后来看看资料焕然大悟,子类虽然无法直接访问私有变量,但是子类继承函数却可以访问,不然的话如果只继承函数而不继承变量

80170

浅谈C++多态性

假设没有使用虚函数的话,即没有利用C++多态性,则利用基指针调用对应函数时候,将总被限制在基函数本身,而无法调用到子类中被重写过函数。...并非非常理解这样使用方法原理上来解释,因为B是子类指针,尽管被赋予了基对象地址,可是ptr->foo()在调用时候,因为地址偏移量固定,偏移量是子类对象偏移量,于是即使在指向了一个基对象情况下...C++虚函数 一、定义 虚函数是在基中声明虚函数,它在基中未定义,但要求不论什么派生都要定义自己实现方法。...在基中实现虚函数方法是在函数原型后加“=0” virtual void funtion()=0 二、引入原因 1、为了方便使用多态特性,我们经常须要在基中定义虚拟函数。...为了解决上述问题,引入了虚函数概念,将函数定义为虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生中必须予以重写以实现多态性。

37110

【C++】自学终极笔记

错误示例: void func(int); int func(int);//返回类型不同则无法实现重载 默认参数函数: 有默认值参数应该位于参数列表右侧 默认参数应该右向左设置: 默认参数赋值应该右边参数开始...抽象: 抽象是包含虚函数。抽象不能被实例化,它用于定义接口,由派生提供具体实现。...public E{//公有继承:B继承A+E成员函数和数据成员 //... } 继承后派生能够访问public、protected成员,不能访问private成员 而外普通函数、对象能够访问...public成员,不能访问private、protected成员 不管哪种继承方式,父私有成员都不可以访问 派生构造: 会依次调用父构造函数,析构与构造顺序相反。...这确保在使用基指针指向派生对象时,可以正确调用派生析构函数,避免内存泄漏。 虚函数: 虚函数本身在基中没有具体实现,而是在派生中被强制要求实现。

17410

C++多态原理揭秘

抽象不能被实例化,也就是不能创建对象但是可以定义指向抽象指针和引用,并通过派生对象地址来初始化它们。 派生必须实现其基中所有的虚函数,否则它仍然是抽象无法被实例化。...因为抽象虚函数只有函数名,没有实现体,所以无法被单独实例化。但是,抽象可以被用作基,在派生中实现虚函数,从而实现不同多态行为。 规范派生实现。...抽象中定义虚函数,是对派生接口规范。派生必须实现这些虚函数,否则无法被实例化。这样可以避免派生在实现中遗漏必要函数或参数,从而保证代码正确性。 封装实现细节。...派生虚表 派生虚表有两部分构成: 第一部分: 中继承下来虚函数(如果在派生中也定义了,就会重写,也就实现了多态). 第二部分: 派生自己虚函数,放在虚函数表下半部分....派生自己虚函数,存放在第一个基虚表后面, 对于菱形虚拟继承,菱形继承都不推荐设计,就别谈菱形虚拟继承了,这里也就不讨论了. c++中有关多态知识,到这里就结尾了,如果文章有什么错误之处,希望与牛牛私信交流

13420

再探虚函数

2、虚函数是在基中声明虚函数,它在基中没有定义,但要求任何派生都要定义自己实现方法。在基中实现虚函数方法是在函数原型后加"=0" 3、声明了虚函数是一个抽象。...所以,用户不能创建实例,只能创建它派生实例,它必须在继承中重新声明函数。 4、定义虚函数目的在于,使派生仅仅只是继承函数接口。...如果说,抽象无法实例化对象,那就无法使用对象方法了嘛。...只有在基析构函数定义为虚函数时,调用操作符delete销毁指向对象指针时,才能准确调用派生析构函数(该级向上按序调用虚函数),才能准确销毁数据。...vptr是一个指针,在构造函数中创建生成,并且只能用this指针访问它,因为它是一个成员,并且vptr指向保存虚函数地址vtable.对于静态成员函数,它没有this指针,所以无法访问vptr

85920

virtual

简单说明: 虚函数就像是java 中接口函数,不能直接实例化,必须被派生继承,然后对基虚函数进行实现。...这也很自然解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法代码中看书程序在调用是哪个函数。...覆盖函数前必须加关键字virtual,重载和virtual没有任何关系。 关于C++隐藏规则 如果派生函数与基函数同名,但是参数不同。...此时,无论有无virtual关键字,积累函数将被隐藏(注意别与重载混淆)。 如果派生函数与积累函数同名,并且参数也相同,但是基函数没有virtual关键字。...但是,它本身并不能通过虚拟机制被调用,这就是虚拟函数(pure virtual function)。

64350

领悟面向对象就离开发应用不远了(提高)有你对面向对象所有疑问,爆肝1w字

文章目录 前言 一、面向对象 二、使用 1.基础使用 2.运算符重载 3.友元 1.友元函数 2.友元 3.友元成员函数 三、继承 基 派生 插个访问权限事情 2.多态 ***公有 **...(继承了基实现) 派生还继承了基接口 当然派生和其他使用方法大致一样:可以有自己构造函数,可以添加额外数据成员和成员函数 插个访问权限事情 首先派生不能直接访问私有成员,...这样就可以将基派生同名方法区分开,实现多态。 3.抽象基 不能实例化被称为抽象基, 这样只有一个用途, 那就是派生出其他。...抽象基提供了一种非常好机制,让您能够声明所有派生都必须实现函数。如果 Trout Fish 派生而来,但没有实现 Trout::Swim( ),将无法通过编译。...② 之间应满足子类型关系,通常表现为一个另一个公有派生而来。 ③ 必须先使用基指针指向子类型对象,然后直接或者间接使用基指针调用虚函数。

51320

派生多态虚函数?

成员函数与继承派生可以继承其基成员, 然而有时候派生必须对其重新定义。派生需要对这些操作提供自己新定义以覆盖继承而来旧定义。...派生可以继承定义在基成员,但是派生成员函数不一定有权访问继承而来成员。 和其他使用基代码一样,派生访问公有成员,而不能访问私有成员。...现在,我们只需知道访问说明符作用是控制派生继承而来成员是否对派生用户可见。 如果一个派生是公有的,则基公有成员也是派生接口组成部分。...多态: 多态:静态多态,动态多态 静态多态:函数重载,运算符重载,复用函数名 动态多态:派生和虚函数实现运行时多态 区别: 静态多态函数地址 早绑定-》编译阶段确定函数地址 动态多态函数地址...1.虚析构与虚析构共性: 解决父指针释放子类对象不干净问题 都需要有具体函数实现 2.区别: 如果是虚析构,该类属于抽象无法实例化 .虚析构语法: virtual ~名(){}

16220

1小时精通c++面向对象编程

图5-5 静态联编 示例可以看出,通过对象指针进行普通成员函数调用,仅仅与指针类型有关,而与此刻指针正指向什么对象无关。...动态联编优点是灵活性强,但效率低 实现动态联编需要同时满足以下三个条件: 1必须把动态联编行为定义为虚函数 2之间应满足子类型关系,通常表现为一个另一个公有派生而来 3必须先使用基指针指向子类型对象...图5-7 虚函数与动态联编 解释一下上面的程序,BA公有继承,B是A子类型,Bact1()为虚函数,b.act2()调用A中act2(),进一步调用act1(),产生动态束定,运行时选择B::...图5-9 虚函数 5.6 抽象 带有虚函数称为抽象 抽象只能作为基使用,其虚函数实现由派生给出;但派生仍可不给出虚函数定义,继续作为抽象存在 抽象不能定义对象,一般将该类构造函数说明为保护访问控制权限...,其完整实现由派生完成 2用作指针或引用基类型:保证进入继承层次每个都具有(提供)虚函数所要求行为 ?

82630

【C++】多态

,除非重写虚函数; 虚函数相当于规范了派生必须进行虚函数重写,另外虚函数更体现出了接口继承。...3、菱形继承、菱形虚拟继承虚表 在上一节继承中我们就提到,实际中我们不建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问成员有一定得性能损耗;实际上研究菱形继承和菱形虚拟继承在实际工作中是几乎没有意义...,正确是( ) A:声明虚函数不能实例化对象 B:声明虚函数是虚基 C:子类必须实现基虚函数 D:虚函数必须是空函数 关于虚表说法正确是( ) A:一个只能有一张虚表...-- 不能,因为静态成员没有 this 指针,而虚函数要通过虚表调用,虚表要通过对象中虚表指针来查找,无法使用类型::成员函数调用方式直接访问虚表。 构造函数可以是虚函数吗?...-- 不能,因为如果构造函数是虚函数的话,实例化对象时需要先从虚表中取出构造函数地址,虽然虚表在编译时就生成好了,但是虚表指针在构造函数初始化列表完成初始化,所以再对象完成构造之前,我们无法通过虚表指针访问虚表

45100

C++进阶-多态

协变 虚函数返回基对象指针或者引用,派生虚函数返回派生对象指针或者引用时,称为协变(基派生虚函数返回值类型不同) 示例: class A {}; class B : public...,只有重写虚函数,派生才能实例化出对象 虚函数规范了派生必须重写,另外虚函数更体现出了接口继承 示例: class Car { public: virtual void Drive...,访问成员有一定得性能损耗 大概结果:示例: B继承A C继承A D继承B,C 五、继承和多态常见面试问题 什么是多态?...不能,因为静态成员函数没有this指针,不能通过对象指针找到其虚函数表,使用类型::成员函数调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表 构造函数可以是虚函数吗?...可以,并且最好把基析构函数定义成虚函数 当基指针指向new出来对象或new出来派生对象时,需要使用指针进行释放对象,此时需要析构函数为虚函数,保证指针指向对象成功释放 对象访问普通函数快还是虚函数更快

57930

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

那么在继承中要 构成多态还有两个条件: 必须通过基指针或者引用调用虚函数 被调用函数必须是虚函数,且派生必须对基虚函数进行重写 2.虚函数 我们在讲继承菱形继承时候曾经说到过虚拟继承...包含虚函数叫做抽象(也叫接口 ),抽象不能实例化出对象 。派生继承后也不能实例化出对象, 只有重写虚函数,派生 才能实例化出对象 。...虚函数规范了派生必须重写,另外虚函数更体现出了接口继承。 2.接口继承和实现继承 普通函数继承是一种 实现继承 ,派生继承了基函数,可以使用函数,继承是函数实 现。...菱形继承、菱形虚拟继承 实际中我们不建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样 模型,访问成员有一定得性能损耗。...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3. 构造函数可以是虚函数吗?

72750

【C++】多态——实现、重写、抽象、多态原理

包含虚函数叫做抽象(也叫接口),抽象不能实例化出对象。派生继承后也不能实例化出对象,只有重写虚函数,派生才能实例化出对象。...虚函数规范了派生必须重写,另外虚函数更体现出了接口继承。...3.菱形继承、菱形虚拟继承 实际中我们不建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问成员有一定得性能损耗。...不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3.构造函数可以是虚函数吗?...不能,因为对象中虚函数表指针是在构造函数初始化列表阶段才初始化 4.对象访问普通函数快还是虚函数更快? 对于普通对象,是一样快

41730

【C++】多态

如果一个虚函数在接口后面加上=0,则这个虚函数为虚函数,虚函数所在为抽象,抽象是不可以被实例化出对象,如果抽象被继承,派生里面天然就会有虚函数,那么派生也就变成了抽象,一个如果连对象都实例化不出来...//抽象从某种程度上说,就是强迫子类重写虚函数。 //override是检查虚函数是否重写,抽象是强迫派生重写虚函数,否则派生无法实例化出对象。...下面这道题输出结果是"class A", “class B”, “class C”, “class D”,首先这是一个菱形虚拟继承,那么A成员变量在D成员中只会出现一份,因为菱形虚拟继承可以解决数据冗余和二义性问题...内存角度和语法角度来看,菱形继承分别带来了数据冗余和二义性问题,虚拟继承能够解决菱形继承原理即通过虚基表方式进行解决,内存中只存一份虚基成员,腰部派生访问时通过自身成员模型中虚基表来进行访问...虚函数所在称之为抽象,抽象会强制其派生重写虚函数,因为如果不重写虚函数,派生无法实例化出对象,那就失去了其存在意义。

52320

【c++】全面理解C++多态:虚函数表深度剖析与实践应用

在给定代码中,Person 析构函数被声明为虚拟: virtual ~Person() { cout << "~Person()" << endl; } 这意味着任何 Person 派生,...其中 p2 是一个基 Person 类型指针,指向一个 Student 对象),Student 析构函数首先会被调用(子类),然后是 Person 析构函数(基) 因此,重写基虚拟析构函数确保了当通过基指向派生对象指针进行...和 final C++对函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有在程序运行时没有得到预期结果才来debug会得不偿失...func() // 注意:现在Basefunc()和func(int)都被隐藏,只能通过Derived对象访问func(double) }; 在继承中隐藏了基同名函数(不论是重载还是同签名函数...包含虚函数叫做抽象(也叫接口),抽象不能实例化出对象。派生继承后也不能实例化出对象,只有重写虚函数,派生才能实例化出对象。

21000

【C++】———— 多态

权限要求不同:重载访问权限没有要求,重写要求子类中重写函数不能比父被重写函数有更严格访问权限。 与虚函数关系:重载与虚函数无关,重写函数通常是父虚函数。...包含虚函数叫做抽象(也叫接口),抽象不能实例化出对象。派生继承后也不能实例化出对象,只有重写虚函数,派生才能实例化出对象。...虚函数规范了派生必须重写,另外虚函数更体现出了接口继承。 注意这里包含,只要里面有一个有虚函数,就是抽象,就无法实例化对象,间接强制派生重写。...去找s虚表虚函数也同理 五、做一道题吧 这道题选B,很难相信 首先,B类型对象p去调用test(); test()是B继承下来,但是里面默认存放this指针依然是A*,将一个B类型指针传给...A类型指针,会发生多态,B里面的func()是重写了Afunc() (Afunc()为虚函数,B重写了可以不写virtual)。

9710

轻松搞定面试中“虚”

虚函数作用是允许在派生中重新定义与基类同名函数,并且可以通过基指针或引用来访问派生同名函数,达到多态目的。 2.什么是虚函数,什么是,有什么作用?...因为虚函数是不能被调用,包含虚函数无法建立对象。 抽象作用是作为一个共同基,或者说,为一个族提供一个公共接口。 3.为什么有的析构函数需要设为virtual?...是否每个析构函数都要设置成virtual?是否可以将析构函数设置成内联函数。 这样做是为了当用一个基指针删除一个派生对象时,派生析构函数会被调用。...虚拟继承与普通继承不同是,虚拟继承可以防止出现diamond继承时,一个派生中同时出现了两个基子对象。也就是说,为了保证这一点,在虚拟继承情况下,基子对象布局是不同于普通继承。...RTTI(Run-Time Type Information)运行时类型检查英文缩写,它提供了运行时确定对象类型方法,通过RTTI,能够通过基指针或引用来检索其所指对象实际类型。

66020

2021腾讯实习一面复盘-小丑竟是我自己

比如重写父方法重载同一方法等。 C/C++构成多态条件: 调用函数对象必须是指针或者引用。 被调用函数必须是虚函数,且完成了虚函数重写。...调用函数参数必须是指针或引用,因为派生改变了虚表,那么这个虚表就属于派生对象,赋值时只会把基成员给过去,虚表指针不会给。...若派生中有一个跟基完全相同虚函数(函数名、参数、返回值相同),我们就称子类虚函数重写了基虚函数。 协变:重写虚函数返回值可以不同,但是必须分别是基指针或引用和派生指针或引用。...,包含虚函数叫做抽象(或接口),抽象不能实例化出对象。...派生继承后也不能实例化出对象,只有重写虚函数,派生才能实例化出对象。

56620
领券