C++-为什么内联函数,构造函数,静态成员函数不能为virtual函数

C++-为什么内联函数,构造函数,静态成员函数不能为virtual函数

归属感 发布于 2017-01-20 字数 64 浏览 1201 回复 4

为什么内联函数,构造函数,静态成员函数不能为virtual函数?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

灵芸 2017-10-27 4 楼

1> 内联函数

内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数。

2> 构造函数

构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数。

3> 静态成员函数

静态成员函数属于一个类而非某一对象,没有this指针,它无法进行对象的判别。

这个可以从两个角度去理解:
1。virtual意味着在执行时期进行绑定,所以在编译时刻需确定信息的不能为virtual
构造函数需在编译时刻,因为需构造出个对象,才能执行动作。
静态成员函数不属于任何一个对象,编译时刻确定不存在执行的时候选择执行哪个的情形。
内联函数,由于属于编译器的建议机制,所以其实可以virtual。
2。virtual意味着派生类可以改写其动作
派生类的构造函数会先执行基类的构造函数而不是取代基类构造函数,也就是说基类的构造函数可以看作派生类构造函数的组成,所以并不能改写这个函数。
静态成员函数不属于任何一个对象,所以更不能改写其动作了。

inline和virtual不会同时起作用。带virtual的函数在不需要动态绑定调用的时候,就可以inline。

灵芸 2017-09-13 3 楼

对 请采纳,不对请忽略,不大熟

virtual关健字声明的函数叫虚拟函数,被virtual声明过的函数可以才重写
内联函数,构造函数,静态成员函数不能被重写,所以不能声明为虚拟函数

晚风撩人 2017-07-03 2 楼

内联函数:
内联函数时在编译时期展开,而虚函数的特性是动态的。所以一般内联函数不能为virtual。
但是当virtual函数不需要动态绑定的时候,是可以声明为inline的。这个并不一定矛盾。
需要注意的是:inline和virtual不会同时起作用。

构造函数:
虚函数是建立在对象之上的,而在构造函数调用之前对象还不存在。因此构造函数不能为virtual。

静态成员函数属于一个类而不属于一个对象,没有this指针,因此不能为virtual。

这个可以从两个角度去理解:
1。virtual意味着在执行时期进行绑定,所以在编译时刻需确定信息的不能为virtual 。
构造函数需在编译时刻,因为需构造出个对象,才能执行动作。
静态成员函数不属于任何一个对象,编译时刻确定不存在执行的时候选择执行哪个的情形 。
内联函数,由于属于编译器的建议机制,所以可以virtual 。
2。virtual意味着派生类可以改写其动作
派生类的构造函数会先执行基类的构造函数而不是代基类构造函数,也就是说基类的构造函数可以看作派生类构造函数的组成,所以并不能改写这个函数 。
静态成员函数不属于任何一个对象,所以更不能改写其动作了。

偏爱自由 2017-06-09 1 楼

内联函数不能定义为virtual函数的原因:如果一个函数为内联函数,那么每个对象都有一个这个函数的实例,并且在编译时,编译器要求inline函数的代码必须可见
构造函数:构造函数的作用就是为对象初始化内存内容,其中也包括虚函数表,如果一个对象连虚函数表都没有,怎么去访问虚函数?
静态成员函数:首先,从名字上来说 - -,静态成员函数,就是静态的意思,不支持执行期确定调用哪个 - -。原理上来说,静态成员函数本身就不属于某一个特定的对象,调用的时候不会传递this指针进去,所以也就没办法去读相应对象的虚函数表,所以多态也就无从谈起了