Учитывая базу и производные классы, как показано ниже:Почему динамическое связывание не было таким, как ожидалось?
Базовые:
class AA
{
public:
AA() = default;
virtual void print() const { std::cout << aa << "\n";}
private:
std::string aa = "AA";
};
Производный:
class BB : public AA
{
public:
BB() = default;
virtual void print() const override {std::cout << bb << "\n"; }
private:
std::string bb = "BB";
};
Первая попытка:
int main()
{
AA aa; BB bb;
AA& //r = aa; r.print();
r = bb;
r.print();
return 0;
}
Результат был точно что я ожидал:
BB
Press <RETURN> to close this window...
Но вторая попытка, когда //
был удален:
int main()
{
AA aa; BB bb;
AA& r = aa; r.print();
r = bb;
r.print();
//!^^^^^^^^^^--why wasn't the print in derived class called?
return 0;
}
Выход был:
AA
AA
Press <RETURN> to close this window...
Как отметил выше, почему был не print
определен в производном классе вызывается, когда выполнение второго r.print()
?
Так на самом деле оператор 'г = bb' изменил значение' aa' путем копирования суб - объект объекта 'bb' к нему, не так ли? –
Я не уверен, что я следую терминологии «предмет объекта», но да: 'r = bb' просто запускает' aa.AA :: operator = (bb) ', что, в свою очередь, копирует' AA'-части 'bb' в' AA'. – user4815162342
Извините за мою глупую орфографию, я должен был написать как подобъект ... и не знаю, почему я не могу на ваше имя user4815162342 .. –