C++基礎類別和派生類賦值(初始化)規則

2020-07-16 10:04:20
在公有派生的情況下,有以下三條賦值相容規則。
  • 派生類的物件可以賦值給基礎類別物件。
  • 派生類物件可以用來初始化基礎類別參照。
  • 派生類物件的地址可以賦值給基礎類別指標,亦即派生類的指標可以賦值給基礎類別的指標。

上面三條反過來是不成立的。例如,不能把基礎類別物件賦值給派生類物件。

下面的程式能夠成功編譯,充分說明了上述三條規則。
class A {
};
class B : public A  //公有派生
{
};
int main()
{
    A a;
    B b;
    a = b;  //派生類物件賦值給基礎類別物件
    A& r = b;  //派生類物件初始化基礎類別參照
    A* pa = &b;  //派生類物件地址賦值給基礎類別指標
    B* pb = &b;
    pa = pb;  //派生類指標賦值給基礎類別指標
    return 0;
}
將派生類物件賦值給基礎類別物件(如上面程式中的a=b;語句),在賦值號沒有被過載的情況下,所做的操作就是將派生類物件中的基礎類別物件逐個位元組地複製到=左邊的基礎類別物件中。

在公有派生的情況下,可以說,派生類物件也是基礎類別物件,任何本該出現基礎類別物件的地方,如果出現的是派生類的物件,也是沒有問題的。但如果派生方式不是 public,而是 private 或 protected,那麼上面這個結論就不成立了。