首页 > 试题广场 >

什么函数不能声明为虚函数?

[不定项选择题]
什么函数不能声明为虚函数?
  • 静态成员函数
  • 内联函数
  • 构造函数
  • 析构函数
1.普通函数(不能被覆盖) 
2.友元函数(C++不支持友元函数继承)
3.内联函数(编译期间展开,虚函数是在运行期间绑定)
4.构造函数(没有对象不能使用构造函数,先有构造函数后有虚函数,虚函数是对对象的动作) 
5.静态成员函数(只有一份大家共享) 
编辑于 2015-09-05 10:29:43 回复(9)
只需要记住可以声明成虚函数的就行!(普通的成员函数或析构函数)
虚函数的使用原则:可以把public或protected的部分成员函数声明为虚函数;
                 C++中的析构函数通常是虚析构函数;
                 构造函数不能声明为虚函数;
                 虚函数不能声明为静态的、全局的、友元的。

编辑于 2017-04-06 16:48:24 回复(1)
ABC 常见的不能声明为虚函数的有:普通函数(非成员函数)、静态成员函数、内联成员函数、构造函数、友元函数。
发表于 2015-03-27 13:52:31 回复(0)
inline内联函数不能被取到地址所以不能成为虚函数
发表于 2014-10-25 00:25:58 回复(0)
虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数
发表于 2017-03-28 09:33:56 回复(0)
感觉选AC吧。理由如下:

虚函数是为了 实现动态绑定 ,不能声明为虚函数的有

1、静态成员函数;2、类外的普通函数;3、构造函数;4、友元函数

此外,还有一些函数可以声明为虚函数,但是没有意义,但编译器不会报错,如:

1、 赋值运算符的重载成员函数:因 为复制操作符的重载函数往往要求形参与类本身的类型一致才能实现函数功能,故形参类型往往是基类的类型,因此即使声明为虚函数,也把虚函数当普通基类普通函数使用。

2、 内联函数: 内联函数目的是在代码中直接展开(编译期),而虚函数是为了继承后能动态绑定执行自己的动作(动态绑定),因此本质是矛盾的,因此即使内联函数声明为虚函数,编译器遇到这种情况是不会进行inline展开的,而是当作普通函数来处理。因此声明了虚函数不能实现内敛的,即内敛函数可以声明为虚函数,但是毫无了内联的意义

发表于 2017-03-17 20:42:31 回复(0)
答案:选项A、B、C
常见的不能声明为虚函数的有普通函数(非成员函数)、静态成员函数、内联成员函数、构造函数和友元函数。以下将分别对这几种情况进行分析。

1)普通函数(非成员函数)只能overload(重载),不能被override(覆盖),不能被声明为虚函数,因此,编译器会在编译时绑定函数。

2)静态成员函数不能是虚函数,因为静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,它不归某个对象所有,所以,它也没有动态绑定的必要性。

3)内联成员函数不能是虚函数,因为内联函数本身就是为了在代码中直接展开,减少函数调用花费的代价而设立的,而虚函数是为了在继承后对象能够准确地执行自己的动作,这是不可能统一的。再说,inline函数在编译时被展开,虚函数在运行时才能动态地绑定函数。

4)构造函数之所以不能是虚函数,因为构造函数本来是为了明确初始化对象成员才产生的,然而虚函数主要是为了在不完全了解细节的情况下也能正确处理对象。另外,虚函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用虚函数来完成你想完成的动作?

5)友元函数。C++语言不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。友元函数不属于类的成员函数,不能被继承。所以,友元函数不能是虚函数。

发表于 2018-07-13 14:59:14 回复(0)
析构函数不可以是虚函数么?不是这样子的吧,当产生多态时,如果父类的析构函数不加上virtual的话,只会析构父类而不会析构子类,这样会造成内存泄漏
发表于 2017-07-12 17:53:45 回复(0)
虚函数一般不声明为内联函数,因为对虚函数的调用需要动态绑定,而对内联函数的处理是静态的,所以虚函数一般不能以内联函数处理,但是将虚函数声明为内敛函数也不会引起错误的。
编译了下,是没有错的!
编辑于 2015-09-30 10:26:09 回复(1)
为什么选B错了?内敛函数不是不可以成为虚函数吗?
编辑于 2024-03-17 21:14:25 回复(0)
除了类非静态成员函数和析构函数可以是虚函数外,其他函数都不能是虚函数,包括类外的普通函数,构造函数,静态成员函数,友元函数,内联函数。其中构造函数不能是虚函数是因为虚函数是针对类对象的,如果构造函数是虚函数,那么就需要在内存代码段的.rodata只读存储区的虚函数表找到虚构造函数的地址,然后类对象的实例化须通过构造函数,即不调用构造函数就无法实例化,要调用构造函数又得先实例化。而其它的,虚函数不能是全局的、静态的、友元的。总结的本质原因是虚函数是针对类对象的。
发表于 2020-06-29 11:12:21 回复(0)
A静态成员函数,它是属于类的,并不属于某个对象,因而不能声明为虚函数,因为声明了是没啥意义的
B内联函数,严格来说它会在编译之后,展开成代码,并不是一个函数
C不同类的构造函数名字肯定不一样,所以,也就没有必要声明为虚函数了
发表于 2018-03-21 17:54:03 回复(0)
虚函数是可以内联的,但是内不内联不是你声明说了算,是编译器决定的,当要体现多态时,编译器肯定会屏蔽掉inline
编辑于 2023-12-26 11:33:32 回复(1)
那为啥答案说B错了
发表于 2023-08-10 23:25:33 回复(0)

虚函数允许函数重写,具体实现时通过对象的虚表(虚函数指针数组,成员变量)实现,而静态成员函数不依赖对象实现,不存在成员变量,因此不能是虚函数。简单的说静态成员函数没有this指针,所以没有虚表,不能实现虚函数的功能,因此不能是虚函数。

发表于 2023-03-01 09:42:17 回复(0)
内联inline就是给编译器个提示而已,告诉编译器我希望该函数内联。具体内联与否取决于编译器,或者说你代码就一行但没有inline关键字,编译器一样有可能实现内联。决定权在编译器。那么如果inline和virtual关键字同时存在,编译器相当于会完全忽视inline关键字。因为virtual函数显然无法内联。
发表于 2022-10-04 10:20:38 回复(0)
AC不能是虚函数这显而易见了,至于B,是因为如果虚函数表示为多态的时候就不可以内联,但是如果用了虚函数但是没表现出多态的性质那就可以内联。
简单来说,本质就是,如果是多态性质,那就是说我在编译的时候不知道要进去的是父类函数还是子类函数所以会报错。
但是如果你代码子类往下没有相同的虚函数,那就没问题,因为编译器知道你所调用的地方在哪里。
但是虚函数的设置就是为了多态,所以你给内联函数弄了虚函数,但又没发生重写,那这个虚函数没屁用,仅仅只是作为考题而已,实际没啥用。
发表于 2022-08-17 20:10:50 回复(0)
答案错了
发表于 2022-05-20 18:45:28 回复(0)
只有普通函数和析构函数才能声明为虚函数
发表于 2021-03-13 09:29:35 回复(0)
不是当虚函数不表现为多态的情况下,内联函数是可以声明为虚函数的吗?
发表于 2020-09-20 11:45:46 回复(0)