在C++中,当从构造函数中调用虚拟函数时,它的行为与虚拟函数不同。
我想每个第一次遇到这种行为的人都很惊讶,但转念一想,这是有道理的:
只要派生构造函数尚未执行,对象就不是,而是派生的实例。
那么,如何调用派生函数呢?这些先决条件还没有机会建立起来。例子:
class base {
public:
base()
{
std::cout << "foo is " << foo() << std::endl;
}
virtual int foo() { return 42; }
};
class derived : public base {
int* ptr_;
public:
derived(int i) : ptr_(new int(i*i)) { }
// The following cannot be called before derived::derived due to how C++ behaves,
// if it was possible... Kaboom!
virtual int foo() { return *ptr_; }
};
Java和.NET完全一样,但他们选择了另一种方式,这可能是最小惊喜原则的唯一原因?
你认为哪个是正确的选择?