首页 > 试题广场 >

下面哪些函数不能被声明为虚函数( &nb...

[不定项选择题]
下面哪些函数不能被声明为虚函数(      )
  • 构造函数
  • 静态成员函数
  • 内联函数
  • 友元函数
什么样的函数不能声明为虚函数?1)不能被继承的函数。2)不能被重写的函数。

1)普通函数

普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。

而多态体现在运行时绑定。通常通过基类指针指向子类对象实现多态。

2)友元函数

友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

3)构造函数

首先说下什么是构造函数,构造函数是用来初始化对象的。假如子类可以继承基类构造函数,那么子类对象的构造将使用基类的构造函数,而基类构造函数并不知道子类的有什么成员,显然是不符合语义的。从另外一个角度来讲,多态是通过基类指针指向子类对象来实现多态的,在对象构造之前并没有对象产生,因此无法使用多态特性,这是矛盾的。因此构造函数不允许继承。

4)内联成员函数

我们需要知道内联函数就是为了在代码中直接展开,减少函数调用花费的代价。也就是说内联函数是在编译时展开的。而虚函数是为了实现多态,是在运行时绑定的。因此显然内联函数和多态的特性相违背。

5)静态成员函数

首先静态成员函数理论是可继承的。但是静态成员函数是编译时确定的,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。
 ———————————————— 
版权声明:本文为CSDN博主「Datou_Nie」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nie19940803/article/details/77427219
发表于 2019-08-21 13:57:54 回复(2)
构造函数不能是虚函数的原因:①从存储空间角度看,虚函数对应一个指向虚函数表的指针,但这个指向虚表的指针事实上是存储在对象的内存空间中的,假设构造函数是虚的,就需要通过虚表来调用,但是对象还没有实例化,也就是还没有内存空间就无法找到,所以构造函数不能是虚函数;②,从使用角度看,血函数主要用于在信息不全的情况下能使重载的函数得到相应的调用构造函数百就是要初始化实例。
发表于 2019-08-19 23:10:48 回复(0)
内联函数可以申明为虚函数,只是不会把它当作内敛函数展开,内联函数最后决定是由编译器决定的,不是由程序员添加inline决定的,因为有些函数内敛展开或许相对较慢。当然你只有添加了inline才有内联的机会。
发表于 2019-10-25 22:57:15 回复(0)