Это меня немного удивило, но я повозился с кодом и обнаружил, что, по крайней мере на моем компьютере, когда функция принимает родительский класс по ссылке, а вы передаете дочерний экземпляр, проблема нарезки не возникает. Для примера:
#include <iostream>
class Parent
{
public:
virtual void doSomething()
{
using namespace std;
cout << "Parent::DoSomething" << endl;
}
};
class Child : public Parent
{
public:
virtual void doSomething()
{
using namespace std;
cout << "Child::DoSomething" << endl;
}
};
void performSomething(Parent& parent)
{
parent.doSomething();
}
int main(int argc, char** argv)
{
Child myChild;
performSomething(myChild);
return 0;
}
Здесь выводится Child::DoSomething
.
Как я уже сказал, я был немного удивлен. То есть, я знаю, что передача по ссылке - это как передача указателей (но гораздо безопаснее в моем понимании), но я не знал, что при этом я сохраняю полиморфность.
Я просто хочу убедиться, должно ли это происходить или это один из тех случаев типа "это работает на моей машине"?