Я получил эту треску:C++ виртуальных функций неожиданного поведения
class First{
public:
virtual void print(){cout<<"First";}
};
class Second : public First {
public:
virtual void print(){cout<<"Second";}
};
class Third : public Second{
public:
void print(){cout<<"Third";}
int main(){
Third ob;
ob.print();
Second& sec=ob;
sec.print();
First& frs=ob;
frs.print();
}
Все получается как я ожидал, все 3 печатей: «третьих».
Теперь, потому что у меня слишком много кода, и это в основном то же самое с небольшим изменением, я обсужу его в тексте.
Теперь я удаляю виртуальную печать с первой, и она печатает: «Третья Третья», как я и ожидал.
Этот третий раз, я вернул виртуальный первый, но я удаляю его со второго. Теперь он печатает: «Третья Третья Третья». Хм, это не то, чего я ожидал. Предположим, что когда со ссылкой First он видит, что функция виртуальна, он затем проверяет объекты и вызывает метод для третьего, но когда со ссылкой Second он видит, что функция не является виртуальной, почему она все еще вызывает печать третьего?
Это потому, что вы используете ссылку Третьего объекта. даже если вы задали тип времени выполнения, vtable все еще видит его третьим. – Gasim
Функция в 'Second' неявно виртуальна, так как имеет ту же подпись, что и функция в' First'. – dyp
Обратите внимание, что отметка 'print' в' Second' как 'final' даст вам ясную ошибку, когда появится' Third'. – chris