В С++, когда виртуальная функция вызывается из конструктора, она не ведет себя как виртуальная функция. Я думаю, что все, кто столкнулся в первый раз, были удивлены, но, с другой стороны, это имеет смысл, если производный конструктор еще не запущен, объект не, но полученный так, как можно вызывать производную функцию? Предварительные условия не имели возможности быть настроенными. Пример:
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, но они решили пойти другим путем, была ли единственная причина принципа наименьшего удивления?
Какой, по вашему мнению, правильный выбор?