首页 > 试题广场 >

关于虚函数的说法,哪些是正确的

[不定项选择题]
关于虚函数的说法,哪些是正确的
  • 构造函数中调用该类的虚函数,动态绑定机制会生效
  • 静态函数不可以是虚函数
  • 虚函数可以声明为inline
  • 构造函数和析构函数都可以声明为虚函数
推荐
虚函数用于实现运行时的多态,或者称为晚绑定或动态绑定。而内联函数用于提高效率。内联函数的原理是,在编译期间,对调用内联函数的地方的代码替换成函数代码。内联函数对于程序中需要频繁使用和调用的小函数非常有用。
默认地,类中定义的所有函数,除了虚函数之外,会隐式地或自动地当成内联函数(注意:内联只是对于编译器的一个请求,编译器可以自己决定是否进行内联).
无论何时,使用基类指针或引用来调用虚函数,它都不能为内联函数(因为调用发生在运行时)。但是,无论何时,使用类的对象(不是指针或引用)来调用时,可以当做是内联,因为编译器在编译时确切知道对象是哪个类的
所以c是对的
静态函数不属于对象,只属于类,所以b也是对的
编辑于 2018-07-22 17:45:48 回复(4)
静态函数不能定义为虚函数:静态成员函数对于每个类都只有一份代码,所有对象都可以共享这份代码,他不归某一个对象所有,所以它没有动态绑定的必要,不能定义为虚函数。
内联函数不能定义为虚函数:内联函数本就是为了减少函数调用的代价,所以在代码中直接展开。但虚函数一定要创建虚函数表,这两者不可能统一。另外,内联函数在编译时被展开,而虚函数在运行时才动态绑定。但是注意以下误区:
class a
{
	inline virtual void test(){}
};
尽管以上写法是没有语法错误的,并且可以执行,但其实test函数已经不是内联函数了,因为inline只是对编译器的一个建议而已。
搞清本质就好。
发表于 2020-08-24 11:33:43 回复(0)
静态函数不能定义为虚函数:静态成员函数对于每个类都只有一份代码,所有对象都可以共享这份代码,他不归某一个对象所有。
所以它没有动态绑定的必要,不能定义为虚函数

内联函数不能定义为虚函数: 内联函数本就是为了减少函数调用的代价,所有在代码中直接展开。但虚函数一定要创建虚函数表,这两者不可同一。
另外,内联函数在编译时被展开,而虚函数在运行时才动态绑定
发表于 2021-03-08 10:33:39 回复(0)

A选项是错误的。在构造函数中调用虚函数,动态绑定机制不会生效。这是因为,在执行构造函数期间,对象本身尚未完全初始化,其虚函数表(Virtual Function Table)也尚未建立,因此无法进行动态绑定。此时,调用虚函数将只会执行该类定义的版本,而不会进行派生类的重写。

B选项是正确的。静态函数是属于类的函数,它不依赖于任何类的实例,因此无法被动态绑定。虚函数通过动态绑定在运行时进行解析,但静态函数的解析在编译时即可确定,因此无法使用虚函数进行动态绑定。

C选项是不完全正确的。虚函数必须在类中声明为virtual,并可以被子类重写,以实现多态性。然而,C选项未给出一个完整的句子来描述正确性或错误性。如果该选项是要问虚函数会影响类的继承性和多态性,那么这是正确的,因为虚函数允许在子类中进行重写,从而实现多态性。但是如果该选项是想问虚函数是否可以在构造函数中被调用,那么就是错误的,因为在构造函数中调用虚函数,动态绑定机制不会生效。

发表于 2023-10-31 08:57:56 回复(0)
虚函数不可以是内联函数,因为内联函数要在编译期间展开,那样多态性就无法实现。但是虚函数可以声明为inline,这只是一个建议,编译器不会展开它。
发表于 2022-02-04 04:10:57 回复(1)
A不是正确的吗?
发表于 2020-11-06 13:32:11 回复(1)
虚表指针的初始化发生在构造函数的调用过程中,所以构造函数中调用虚函数,导致动态绑定失败;虚函数不可以被定义为内联函数,因为内联函数需要在编译期间展开,多态性无法实现;但是虚函数可以声明为 inline ,这只是一个建议,编译器不会展开
编辑于 2023-09-22 14:48:59 回复(0)
A选项应该指定在基类的构造函数中调用虚函数,虚函数会失效
发表于 2022-09-16 11:29:56 回复(0)
a有点构造函数声明为虚函数哪个味了
发表于 2022-09-09 02:33:38 回复(0)
inline 是可以为虚函数的。只不过当对象调用时生效,因为此时为静态联编。
发表于 2022-07-21 00:15:22 回复(0)
到底虚函数能不能声明为内联(inline),这里说是可以,前面看到一题说是不可以

发表于 2022-06-17 16:33:52 回复(1)
A:动态绑定机制并不会生效 程序会先去调用基类的虚函数,然后再去调用子类的虚函数。相当于调用2次。 这个与构造函数执行顺序有关。
发表于 2022-01-07 07:58:19 回复(0)
A:运行时,非调用时
发表于 2021-05-05 22:19:23 回复(0)
内联函数是编译器把替换到函数调用处,是静态编译;而虚函数动态调用的,若声明为内联函数,编译器不知道调用的是父类还是子类,所以编译器会忽略。因此,c不正确~
发表于 2021-05-05 15:56:25 回复(0)
内敛函数是不能为虚函数的,可以声明为inline,但是编译器不会采纳
发表于 2021-03-22 14:39:36 回复(0)