首页 > 试题广场 >

内联函数、构造函数、静态成员函数可以是虚函数吗?

[问答题]
内联函数、构造函数、静态成员函数可以是虚函数吗?
都不可以。内联函数需要在编译阶段展开,而虚函数是运行时动态绑定的,编译时无法展开; 构造函数在进行调用时还不存在父类和子类的概念,父类只会调用父类的构造函数,子类调用子类 的,因此不存在动态绑定的概念;静态成员函数是以类为单位的函数,与具体对象无关,虚函数是 与对象动态绑定的,因此是两个不冲突的概念;
发表于 2015-05-05 14:31:09 回复(1)
1.内联函数:编译阶段就已经展开,所以不能使用在运行阶段使用的虚函数。
2.构造函数:在构造函数调用前,虚函数指针还未构造完成,所以也不能将其定义为虚函数。
3.静态成员函数:函数参数中无this指针存在,所以不能将其定义为虚函数。
发表于 2015-07-27 09:11:53 回复(0)
均不可以,其中虚函数是运行期确定,而内联函数必须在编译期完成,即虚函数不能被内联
编辑于 2015-07-03 09:00:53 回复(0)
发表于 2015-09-05 19:16:02 回复(0)
首先虚函数是针对对象而言,在运行时候才进行动态联编的。
内联函数是在编译阶段进行展开,inline关键字作为提示符告诉编译器此函数作为内联函数希望在编译阶段展开,但是,编译器并不一定要展开。所以可以声明为虚函数。
构造函数无法是虚函数,因为调用虚函数需要虚函数表指针,而在执行构造函数之前是没有虚函数表指针的。
静态成员函数不可以是虚函数。静态函数是属于类的,不属于对象本身,自然无法有自己的虚函数表指针。
发表于 2015-06-11 16:19:17 回复(0)

关于静态函数从实现层面值得说的是,静态函数没有this指针,无法找到虚表指针,当然也就无法找到虚表,虚函数就无从说起。从虚函数的意义角度来说也不行,总之各种原因,它都无法定义为虚函数


发表于 2018-11-14 00:26:06 回复(0)
关于构造函数不能是虚函数: 虚函数对应一个虚函数指针指向虚函数表,而这个虚函数表存储在对象的存储空间(虚函数表是和对象一起产生的),如果构造函数是虚函数,那么就需要通过这个虚函数表来调用,而此时对象还没有实例化,没有内存空间,无法找到虚函数表,所以根本不能将构造函数声明为虚函数?
发表于 2018-08-06 20:28:03 回复(0)
都不可以
发表于 2015-07-10 10:07:29 回复(0)
答案:都不可以。
1)内联函数需要在编译阶段展开,而虚函数是运行时动态绑定的,编译时无法展开;
2)构造函数在进行调用时还不存在父类和子类的概念,父类只会调用父类的构造函数,子类调用子类 的,因此不存在动态绑定的概念;虚函数使用虚指针调用函数,调用构造函数之前没有构造完成,是没有虚指针的,且vptr的设定和重置是由类的构造函数,拷贝构造函数和赋值运算符完成的。
3)静态成员函数是以类为单位的函数,与具体对象无关,虚函数是 与对象动态绑定的,因此是两个不冲突的概念;
发表于 2015-06-18 19:24:02 回复(0)
都不可以。
内联函数:编译时展开的,虚函数是为了实现多态,是动态行为,两者是矛盾的。内联函数展开就不存在了,也就不存在函数地址了,无法调用
构造函数:虚函数使用虚指针调用函数,调用构造函数之前没有构造完成,是没有虚指针的。另外虚函数是在基类指针中调用派生类函数的方式,构造函数不需要也不可能让你这样做。构造时已经知道了这个类的类型,这和虚函数向矛盾
静态成员函数:静态函数没有this指针,无法调用虚函数。另外静态函数属于类,不属于对象,也就不存在对象虚函数为基础的多态。
编辑于 2015-06-05 10:42:09 回复(0)