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

返回虚函数的静态成员,缺少抽象类的vtable

是一个关于C++语言中虚函数和抽象类的问题。

在C++中,虚函数是通过使用关键字virtual来声明的,它允许在派生类中重写基类的同名函数。虚函数的调用是通过指针或引用来实现的,这样可以在运行时确定要调用的函数。

抽象类是一个包含至少一个纯虚函数(没有实现的虚函数)的类。纯虚函数通过在函数声明后面加上= 0来声明,它们没有函数体。抽象类不能被实例化,只能被用作其他类的基类。

在C++中,每个包含虚函数的类都有一个虚函数表(vtable),它是一个存储了虚函数地址的表格。当一个对象被创建时,编译器会在对象中添加一个指向虚函数表的指针(通常称为vptr)。通过vptr,程序可以在运行时动态地确定要调用的虚函数。

然而,当一个静态成员函数被声明为虚函数时,它不会被添加到虚函数表中。这是因为静态成员函数是与类本身相关联的,而不是与类的实例相关联的。静态成员函数在编译时就已经确定了调用的函数,不需要在运行时进行动态绑定。

缺少抽象类的vtable意味着在这个问题中,我们没有提到抽象类。抽象类是一个包含纯虚函数的类,它的存在可以保证派生类实现了这些纯虚函数。如果缺少抽象类的vtable,可能会导致无法实现对纯虚函数的动态绑定,从而无法正确调用派生类中的函数。

综上所述,返回虚函数的静态成员,缺少抽象类的vtable是一个不合法的情况,因为静态成员函数不会被添加到虚函数表中,而且缺少抽象类的vtable可能导致无法实现对纯虚函数的动态绑定。

(注意:根据要求,本回答不包含任何云计算品牌商的信息。)

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

相关·内容

静态成员函数和非静态成员函数的区别?

一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。...f(Sc &s) 10 { 11 s.nsfn(10); // 转换为Sc::nsfn(&s , 10) 12 s.sfn(10); // 转换为Sc::sfn(10) 13 } 函数...对nsfn()的调用,编译像注解的那样进行转换,s的地址作为第一个传递的参数。(你并不实际写该调用,由编译来实现。)...在函数内部,Sc::nsfn()对非静态成员的访问将自动把this参数作为指向当前对象的指针。而当Sc::sfn()被调用时,没有任何对象的地址被传递。因此,当访问非静态成员时,无this指针出错。...这就是为什么一个静态成员函数与任何当前对象都无联系的原因。

1.9K90

C++类的静态数据成员和静态成员函数

静态成员函数 一般都是在静态成员函数中修改静态数据成员,在刚刚的手机类声明中的成员函数: static void change(); 就是静态成员函数。...我们给它来一个类外定义: void redmik30pro::change() { battery-=10; } 要注意的是,静态成员函数只能访问静态数据成员和静态成员函数,不能访问非静态数据成员,如果要访问非静态数据成员...但是非静态成员函数可以任意地访问静态成员函数和静态数据成员。 那静态成员函数存在的意义是什么?...首先,可能你在做题的时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在类创建的时候就存在了,在没有创建类对象的时候就已经存在静态成员函数,而普通函数必须在类对象被创建的时候才能被使用...简而言之,静态成员函数是服务于类的,而不是某个类对象,它的方便在于不需要定义类对象就能使用。

19230
  • 深入浅出C++虚函数的vptr与vtable

    深入浅出C++虚函数的vptr与vtable 1.基础理论 为了实现虚函数,C ++使用一种称为虚拟表的特殊形式的后期绑定。该虚拟表是用于解决在动态/后期绑定方式的函数调用函数的查找表。...虚拟表有时会使用其他名称,例如“vtable”,“虚函数表”,“虚方法表”或“调度表”。 虚拟表实际上非常简单,虽然用文字描述有点复杂。...首先,每个使用虚函数的类(或者从使用虚函数的类派生)都有自己的虚拟表。该表只是编译器在编译时设置的静态数组。虚拟表包含可由类的对象调用的每个虚函数的一个条目。.../** * @file vptr1.cpp * @brief C++虚函数vptr和vtable * 编译:g++ -g -o vptr vptr1.cpp -std=c++11 * @author...除此之外,上述代码大家会看到,也包含了手动获取vptr地址,并调用vtable中的函数,那么我们一起来验证一下上述的地址与真正在自动调用vtable中的虚函数,比如上述pt->fun1()的时候,是否一致

    4.4K30

    【c++】多态&&虚函数&&抽象类&&继承中的虚函数表详解

    那么在继承中要构成多态还有两个条件: 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 2.2 虚函数 虚函数:即被virtual修饰的类成员函数称为虚函数...: 2.3.1.2 协变 (基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...抽象类 3.1 概念 在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。...静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,比如:函数重载 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数

    38510

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

    }; 3.虚函数的重写(覆盖) 派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同) ,称子类的虚函数重写了基类的虚函数。...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...答:可以,不过编译器就忽略inline属性,这个函数就不再是 inline,因为虚函数要放到虚表中去。 2. 静态成员可以是虚函数吗?...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3. 构造函数可以是虚函数吗?...答:虚函数表是在编译阶段就生成的,一般情况 下存在代码段(常量区)的。 7. 什么是抽象类?抽象类的作用?答:抽象类强制重写了虚函数,另外抽 象类体现出了接口继承关系。

    78250

    C++之多态

    4.虚函数重写的两个例外 协和: 派生类重写基类虚函数时,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时(返回值类型为继承关系的指针),称为协变。...四、抽象类 1.概念 在虚函数的后面写上 = 0,这个虚函数就是纯虚函数。...包含纯虚函数的类,称为抽象类。 抽象类不能实例化处对象,它的派生类也不能实例化处对象,只有派生类重写纯虚函数之后才能实例化出对象。 纯虚函数规范了派生类必须重写,纯虚函数体现出接口继承。...,它们所指向的虚函数表不同,派生类的虚函数表中除了基类的虚函数成员外还有一部分自己的虚函数成员。

    35540

    【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)

    虚函数的重写:也叫做覆盖,当派生类中有一个与基类完全相同(返回值类型、参数列表、函数名都相同)的虚函数时(注意基类中的这个函数也是虚函数),称派生类的该虚函数重写(覆盖)了基类的相应虚函数。...所以运行结果是:B->1 2.4 虚函数重写的特例 2.4.1 协变 所谓协变,指的是派生类重写基类虚函数时,与基类虚函数返回值类型不同,此时需要满足:基类虚函数的返回值是基类对象的指针或引用...,派生类虚函数的返回值是派生类对象的指针或引用。....*/ } }; 2.6 重载、重写、隐藏的对比 三、纯虚函数和抽象类 当我们在虚函数的参数列表之后写一个“=0”,那么该函数就成为了“纯虚函数”。包含纯虚函数的类叫做抽象类。...抽象类有以下特点: 1. 抽象类不能实例化。 2. 抽象类的派生类如果不重写纯虚函数,那么派生类也是抽象类。

    30621

    C++进阶-多态

    协变 类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变(基类与派生类虚函数返回值类型不同) 示例: class A {}; class B : public...概念: 在虚函数的后面写上 =0 ,则这个函数为纯虚函数 包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象 派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象...可以,不过编译器会忽略inline属性,这个函数就不再是inline,因为虚函数要放到虚表中去 静态成员可以是虚函数吗?...不能,因为静态成员函数没有this指针,不能通过对象指针找到其虚函数表,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表 构造函数可以是虚函数吗?...抽象类用来表示现实中一些抽象的事物类型,抽象类不具有实例,派生类只是继承其虚函数接口,它强制派生类重写虚函数,否则派生类也是抽象函数 抽象类体现出了接口继承关系 ,以及用来更好的表示现实中一些抽象的事物类型

    60730

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

    被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 2.2 虚函数  虚函数:即被virtual修饰的类成员函数称为虚函数。...):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的 返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...抽象类  在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口 类),抽象类不能实例化出对象。...静态成员可以是虚函数吗? 答:不能,因为静态成员函数没有this指针,使用类型::成员函数 的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 6. 构造函数可以是虚函数吗?

    8710

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

    : 协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象的指针或者引 用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...答:可以,不过编译器会忽略inline属性,这个函数就不再是inline,因为虚函数要放到虚表中去 静态成员可以是虚函数吗?...答:不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式 无法访问虚函数表,所以静态成员函数无法放进虚函数表。 构造函数可以是虚函数吗?...答:虚函数表是在编译阶段就生成的,一般情况下存在代码 段(常量区)的。 什么是抽象类?抽象类的作用? 答: 抽象类强制重写了虚函数,另外抽象类体现出 了接口继承关系。

    46930

    多态与虚(函数)表

    前言 续接上回(继承),我们了解了继承是如何通过虚基表,来解决派生类和父类有相同的成员变量的情况,但是类和对象中可不只有成员变量,如果成员函数也有同名,更或者如果我们想在访问不同情况(类)但是相同函数名时...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指 针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...二、抽象类 2.1️⃣ 概念 在虚函数的后面写上 =0 ,则这个函数为纯虚函数。...包含纯虚函数的类叫做抽象类(也叫接口 类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生 类才能实例化出对象。...静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态, 比如:函数重载 2.

    57820

    轻松搞定面试中的“虚”

    包括:虚函数,纯虚函数,虚基类,虚继承... 1.什么是虚函数,有什么作用? 在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。...声明纯虚函数的一般形式是                             virtual 函数类型 函数名 (参数表列)=0; 纯虚类也称抽象类,凡是包含纯虚函数的类都是抽象类。...为实现动态联编,编译器为每个包含虚函数的类创建一个表,称为vtable,在vtable中,编译器放置了特定类的虚函数地址,在每个带有虚函数的类中编译器会秘密地设置一个虚函数表指针,称为vptr,指向对象的...vtable,通过基类指针做虚函数调用时,也就是多态调用时,编译器静态地插入取得这个vptr,并在vtable表种查找函数地址的代码,这样就能调用正确的函数。...对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息;对于其他类型,在编译时执行RTTI,返回静态类型信息。 参考 众网友博客

    68120

    什么是多态?如何实现?只看这一篇就够了

    2.2 虚函数 虚函数:即被virtual修饰的类成员函数称为虚函数。...: 协变(基类与派生类虚函数返回值类型不同)派生类重写基类虚函数时,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...抽象类 3.1 概念 在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。...4.3 动态绑定与静态绑定 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,比如:函数重载 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为

    1.5K10

    再探虚函数

    重载函数的关键是函数参数列表——也称函数特征标。包括:函数的参数数目和类型,以及参数的排列顺序。所以,重载函数与返回值,参数名无关。...所以在调用基类的析构函数时,派生类对象的数据成员已经销毁,这个时候再调用子类的虚函数没有任何意义。 ---- Q8:静态函数能定义为虚函数吗?...1、static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。 2、静态与非静态成员函数之间有一个主要的区别,那就是静态成员函数没有this指针。...虚函数依靠vptr和vtable来处理。...vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.对于静态成员函数,它没有this指针,所以无法访问vptr

    87620

    【C++航海王:追寻罗杰的编程之路】多态你了解多少?

    2.2 -> 虚函数 虚函数:即被virtual修饰的类成员函数称为虚函数。...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类函数返回值类型不同。即基类虚函数返回基类对象的指针或引用,派生类虚函数返回派生类对象的指针或引用时,称为协变。...3 -> 抽象类 3.1 -> 概念 在虚函数的后面写上 = 0,则这个函数为纯虚函数。...包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。...静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态, 比如:函数重载。

    8510

    解锁C++多态的魔力:灵活与高效的编码艺术(下)

    5.1.1 典型场景: 静态绑定通常出现在没有使用虚函数的场景下,即普通的成员函数调用时,编译器在编译期就能确定调用的是哪个函数。...这就是静态绑定。 特点: 编译时决定:调用的函数在编译期决定,不依赖运行时的信息。 性能高:静态绑定不需要运行时开销,因此执行效率较高。 缺少灵活性:不能根据实际对象的类型在运行时做出决策。...5.2.2 C++ 中静态绑定与动态绑定的区别总结 静态绑定 动态绑定 绑定发生在编译时 绑定发生在运行时 不需要虚函数表 依赖虚函数表(vtable) 调用的是编译时确定的类型的函数 调用的是运行时对象实际类型的函数...总结 静态绑定发生在编译时,依赖于编译时确定的类型,执行效率高但缺少灵活性。 动态绑定发生在运行时,通过虚函数表查找具体的实现,支持多态,但有一定的运行时开销。...● 静态成员可以是虚函数嘛? 答:不能,因为静态成员函数没有 this 指针,使用“类型::成员函数”的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 ● 构造函数可以是虚函数嘛?

    11610

    多态的讲解

    ,其实覆盖是底层实现上的理解,而重写是语义上的理解,我们在后面也会对其讲解 虚函数 虚函数:即被virtual修饰的类成员函数称为虚函数。...: 协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。...即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。...注意:重载是函数名相同参数不同 抽象类 抽象类的概念 在**虚函数的后面写上 =0 ,则这个函数为纯虚函数。...包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。**派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。

    7310

    【C++】多态(下)

    ,代码段和虚表存放位置接近,而虚表和虚函数相对于静态区栈区以及堆区来说还是离代码段更近近,也就是说,虚函数和普通函数以及虚表存放在代码段 2、多态的原理 class A { public: virtual...地址 3、动态绑定和静态绑定 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,比如:函数重载 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为...: 核心点就是这个函数指针VFPTR,这是一个函数指针,指向的类型是void*,参数为(),也就是无参,也就是说这个指针可以指向任意一个返回类型为void*并且无参的函数 PrintVTable函数的参数也可以写成...VFPTR* vTable,虚表的地址就是指针vTable,后加[]就是对表中的指针进行访问,打印出它们的指针,并且将这些指针指向的函数调用表示出来,让我们可以看到这个地址对应的是哪个函数 main函数...静态成员不可以是虚函数,因为静态成员没有this指针使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表 构造函数不能是虚函数,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的

    7210

    【C++】非常重要的——多态

    静态成员可以是虚函数吗?...不能,因为静态成员函数没有this指针,静态成员函数在类没有实例化对象之前就已经分配空间了,不用实例化对象也可以调用,但是 对于 virtual 虚函数,它的调用恰恰使用this指针。...在有虚函数的类实例中,this指针调用vptr指针,指向的是vtable(虚函数列表),通过虚函数列表找到需要调用的虚函数的地址。...总体来说虚函数的调用关系是: this指针->vptr(4字节)->vtable ->virtual虚函数。 所以说,static静态函数没有this指针,也就无法找到 虚函数 了。...所以静态成员函数不能是虚函数。他们的关键区别就是this指针。 6. 构造函数可以是虚函数吗?

    36130
    领券