鑑於基類和派生類如下:爲什麼動態綁定的行爲不如預期?
基礎:
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()
?
因此,實際上該語句'R = bb'已經改變通過複製子aa'的'值 - 對象的對象'bb'給它,不是嗎? –
我不確定我是否遵循「對象主題」術語,但是:'r = bb'只是運行'aa.AA :: operator =(bb)',然後將'AA'部分複製'bb'轉換成'AA'。 – user4815162342
抱歉我的愚蠢的拼寫,我應該寫作subobject ..並不知道爲什麼我不能在你的名字user4815162342 .. –