Всегда ли передача по ссылке позволяет избежать проблемы срезания?

Это меня немного удивило, но я повозился с кодом и обнаружил, что, по крайней мере на моем компьютере, когда функция принимает родительский класс по ссылке, а вы передаете дочерний экземпляр, проблема нарезки не возникает. Для примера:

#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.

Как я уже сказал, я был немного удивлен. То есть, я знаю, что передача по ссылке - это как передача указателей (но гораздо безопаснее в моем понимании), но я не знал, что при этом я сохраняю полиморфность.

Я просто хочу убедиться, должно ли это происходить или это один из тех случаев типа "это работает на моей машине"?

7
задан Anthony 26 November 2011 в 13:48
поделиться