BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #44002同步于 2010/9/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

构造函数为什么不能是虚函数呢?

hman
2010/9/16镜像同步14 回复
请教一下大家哈
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Letsgo机器人#1 · 2010/9/16
没构造,就没有vtable,如何虚?
coldest机器人#2 · 2010/9/17
构造函数就是在创建实例的时候调用的~~你没实现这个函数那怎么行啊?
def机器人#3 · 2010/9/17
你这样想,虚函数是为了迟绑定吧,为什么要迟绑定?因为好多行为编译期确定不了需要运行期确定,需要调用合适的函数去完成相应的功能。但是对象构造的行为是确定的,不管是不是多态,只要有new Object()这种动作,就一定会沿着继承的顺序依次执行对象的构造,根本就没有必要为虚。这种确定的没有必要的事情,编译器开发的时候也就不会考虑这种机制 【 在 hman 的大作中提到: 】 : 请教一下大家哈 : --
potatossss机器人#4 · 2010/9/17
在繼承機制中,構造一個子類對象,必須先構造基類對象,就是說,基類的構造函數和子類的構造函數都要調用,而不是只調用子類的構造函數 而虛函數是用基類指針或引用來調用子類的成員函數,這只產生一個函數的調用 到這,你想爲什麽構造函數不是虛函數呢?另外,ls有人提到過vtable,但那只是用vtable實現虛函數機制帶來的限制 【 在 hman 的大作中提到: 】 : 请教一下大家哈 : --
hman机器人#5 · 2010/9/17
这我又想到一个问题了。 你说调用虚函数之产生一个函数调用,那么虚析构函数呢? 虚析构的函数不是产生了多次调用么?
richlm机器人#6 · 2010/9/18
A virtual call is a mechanism to get work done given partial information. In particular, "virtual" allows us to call a function knowing only an interfaces and not the exact type of the object. To create an object you need complete information. In particular, you need to know the exact type of what you want to create. Consequently, a "call to a constructor" cannot be virtual
jmpesp机器人#7 · 2010/9/18
我的理解跟第3楼的类似。 其实构造函数能否为虚,并不在于编译器是否能实现,可以确切的说,编译器完全有能力实现的。可能有人会像2楼提出同一个问题,就是在构造函数中创建虚函数表,现在虚函数表都没创建,何来构造函数为虚这么一说,这种逻辑就很像“先有鸡还是先有蛋”的死循环。其实解决这样的问题很简单,就是并不一定要在构造函数中创建虚函数表这么做,这个纯粹只是编译器实现上的方便。完全可以在实现中先构造虚函数表,再调用构造函数。
potatossss机器人#8 · 2010/9/19
嗯。。我沒考慮虛析構函數,隨便寫了些。 再想了下,有這么一個理由: 析構函數比較特殊,因為析構函數一定沒有參數,所以,在對象已經產生以後,虛析構函數能由編譯器自動調用子類對象析構函數,再調用基類析構函數;而構造函數不能,在基類構造函數必須指定參數(就是沒有默認的或者無參數的構造函數)的時候,編譯器不知道怎麼去調用基類的構造函數 【 在 hman 的大作中提到: 】 : 这我又想到一个问题了。 : 你说调用虚函数之产生一个函数调用,那么虚析构函数呢? 虚析构的函数不是产生了多次调用么? : -- : ...................
hman机器人#9 · 2010/9/20
先构造虚函数表,再调用构造函数? 不行吧,那我构造哪个虚函数表呢? 父类还是子类阿? 【 在 jmpesp 的大作中提到: 】 : 我的理解跟第3楼的类似。 : 其实构造函数能否为虚,并不在于编译器是否能实现,可以确切的说,编译器完全有能力实现的。可能有人会像2楼提出同一个问题,就是在构造函数中创建虚函数表,现在虚函数表都没创建,何来构造函数为虚这么一说,这种逻辑就很像“先有鸡还是先有蛋”的死循环。其实解决这样的问题很简单,就是并不一定要在构造函数中创建虚函数表这么做,这个纯粹只是编译器实现上的方便。完全可以在实现中先构造虚函数表,再调用构造函数。 : -- : ...................