В предыдущем вопросе Я цитировал Stroustrup о том, почему общий класс Object для всех классов проблематичен в С++. В этой цитате есть утверждение:
Используя универсальный базовый класс, стоимость: объекты должны быть выделены в виде кучи быть полиморфным;
Я действительно не смотрел на него дважды, и с его на домашней странице Bjarnes Я бы предположил, что многие глаза отсканировали это и сообщал о любых искажениях.
Однако комментатор указал, что это, вероятно, не так, и в ретроспективе я не могу найти веских причин, почему это должно быть правдой. Короткий тестовый пример дает ожидаемый результат "VDerived:: f()".
struct VBase
{
virtual void f() { cout<<"VBase::f()"<<endl; }
};
struct VDerived:VBase
{
void f() { cout<<"VDerived::f()"<<endl; }
};
void test(VBase& obj){
obj.f();
}
int main(int argc, char** argv) {
VDerived obj;
test(obj);
return 0;
}
Конечно, если формальный аргумент для теста был test(VBase obj)
, то случай был бы совершенно другим, но это не было бы аргументом стека против кучи, а скорее копией семантики.
Является ли Бьярне ошибочным или я что-то пропустил?