Это меня немного удивило, но я поигрался с некоторым кодом и обнаружил, что, по крайней мере, на моем компьютере, когда функция принимает родительский класс по ссылке, а вы передаете дочерний экземпляр, проблема срезания не возникает.не происходитДля иллюстрации:
#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
.
Как я уже сказал, я был немного удивлен.Я имею в виду, я знаю, что передача по ссылке - это как прохождение указателей (но в моем понимании это намного безопаснее), но я не знал, что мне все же нужно сохранять полиморфную доброту при этом.
Я просто хочу убедиться, это должно произойти, или это один из тех экземпляров, которые «работают на моей машине»?