在 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 完全一样,但他们选择了另一种方式,这可能是最小意外原则的唯一原因吗?
你认为哪个是正确的选择?