为什么构造函数不能为虚函数
2014-03-11 15:31
363 查看
1.含义上
虚函数含义:
虚函数采用一种叫虚调用的方式,虚调用是一种在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。
----------------------------------------------------------------------------------------------------------
构造函数中调用虚函数安全吗?详见博文:http://blog.csdn.net/huazhongkejidaxuezpp/article/details/20702029
实际而言,安全;vptr能够保证在成员初始化列表之前被设定好。
语义上可能不安全,因为函数本身可能依赖未设立初值的成员
例如:当给基类构造函数(baseclass constructor)提供参数时,在类的constructor的成员初始化列表中调用该class的虚函数,是不安全的。
因为:vptr不是未设定好,就是被设定指向错误的class,进一步讲,该函数所存取的任何类的数据成员一定没有被初始化。
虚函数含义:
虚函数采用一种叫虚调用的方式,虚调用是一种在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。
但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚。
2.使用上
虚函数的作用于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。
而构造函数实在创建对象的时候自动调用的,不可能通过父类的指针或引用去调用,因此规定构造函数不能为虚函数。
而且构造函数提供初始化,对象生命期只执行一次,不是对象的动态行为,也没有太大必要成为虚函数。
3,实现上
vtable在构造函数调用后才建立,因而构造函数不可能为虚函数。
《程序员面试宝典》上的答案:
----------------------------------------------------------------------------------------------------------
构造函数中调用虚函数安全吗?详见博文:http://blog.csdn.net/huazhongkejidaxuezpp/article/details/20702029
实际而言,安全;vptr能够保证在成员初始化列表之前被设定好。
语义上可能不安全,因为函数本身可能依赖未设立初值的成员
例如:当给基类构造函数(baseclass constructor)提供参数时,在类的constructor的成员初始化列表中调用该class的虚函数,是不安全的。
因为:vptr不是未设定好,就是被设定指向错误的class,进一步讲,该函数所存取的任何类的数据成员一定没有被初始化。
相关文章推荐
- 构造函数为什么不能是虚函数
- 为什么构造函数不能为虚函数
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数?
- 为什么构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 构造函数为什么不能是虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 构造函数为什么不能是虚函数
- 为什么构造函数不能为虚函数(转)
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么不能在构造函数中使用虚函数
- 为什么C++的构造函数不能是虚函数
- 构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数
- 为什么构造函数不能为虚函数
- 构造函数为什么不能是虚函数
- 为什么构造函数不能是虚函数
- C++构造函数为什么不能是虚函数
- 构造函数为什么不能是虚函数