У меня есть простой код, который не работает корректно со ссылкой (полиморфизм).Полиморфизм в C++ работает неправильно со ссылкой
#include <iostream>
#include <string>
class Base {
public:
Base() {}
virtual ~Base() {}
virtual std::string text() const {
return "Base";
}
};
class Derived: public Base {
public:
Derived(Base& _b): b(_b) {}
virtual ~Derived() {}
virtual std::string text() const {
return b.text() + " - Derived";
}
private:
Base& b;
};
int main(int argc, char const *argv[])
{
Base b;
Derived d1(b);
std::cout << d1.text() << std::endl;
Derived d2(d1);
std::cout << d2.text() << std::endl;
return 0;
}
И выход:
Base - Derived
Base - Derived
Вторая строка в выводе я ожидал: Base - Derived - Derived
. Я прочитал некоторые ресурсы, и полиморфизм отлично работает со ссылкой и указателем, но в этой ситуации это не так. Если я заменил ссылку на указатель, он снова будет работать. Итак, кто-нибудь может дать мне некоторые объяснения?
Большое спасибо!
Похоже, вы вызываете копию-ctor по умолчанию 'Derived', поскольку вы никогда не предоставляли ее. Значение по умолчанию лучше подходит во втором примере, чем первый (который явно является типом 'Base'). Чтобы доказать это, установите точку останова или выведите debug msg в 'Derived (Base &)'. Вы должны увидеть, что во втором примере он не запускается. Другими словами, d1 является просто копией d2. – WhozCraig