鱼C论坛

 找回密码
 立即注册
查看: 2065|回复: 2

[技术交流] 为什么构造函数,静态成员函数不能为virtual函数

[复制链接]
发表于 2014-4-27 22:04:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

1> 内联函数

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

2> 构造函数

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

3> 静态成员函数

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


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


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




虚构造函数(virtual constructor)

C++ 不支持直接的虚构造函数。虚拟机制的设计目的是使程序员在不完全了解细节(比如只知该类实现了某个界面,而不知该类确切是什么东东)的情况下也能使用对象。但是,要建立一个对象,可不能只知道“这大体上是什么”就完事——你必须完全了解全部细节,清楚地知道你要建立的对象是究竟什么。所以,构造函数当然不能是虚的了。但是,可通过虚函数 virtual clone()(对于拷贝构造函数)或虚函数 virtual create()(对于默认构造函数),得到虚构造函数产生的效果。

注意:子类成员函数clone()的返回值类型故意与父类成员函数clone()的不同。这种特征被称为“协变的返回类型”(Covariant Return Types),该特征最初并不是C++语言的一部分,VC6.0以下版本编译器不支持这样的写法。


虚析构函数(virtual destructor)

当你可能通过基类指针删除派生类对象时,建议使用虚析构函数。虚函数绑定到对象的类的代码,而不是指针/引用的类。如果基类有虚析构函数,delete basePtr(基类指针)时,*basePtr 的对象类型的析构函数被调用,而不是该指针的类型的析构函数。

简单讲,这个类有虚函数就应该有虚析构函数。一旦你在类中加上了一个虚函数,你就已经需要为每一个对象支付空间代价(每个对象一个指针),所以这时使析构函数成为虚拟的通常不会额外付出什么。

对于那些trivial且没有子类的类,虚析构函数只会增加开销,不要使用。




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-27 22:05:34 | 显示全部楼层
发点个人收藏的C++中的几个细节{:7_168:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-28 00:07:32 | 显示全部楼层
感谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 17:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表