對於沒有虛函式的情況:
1.子類物件的指標可以直接賦值給父類的指標,但位址值可能會變化,也就是可能編譯器給自動做了轉換,具體可以看下面的例子。這也是最常規的用法。如果是多層繼承,將子類的指標賦值給父類的指標時,該指標位址會自動轉換到該父類的成員的開始位址的地方。
2.父類的物件的指標不能直接賦值給子類的指標,編譯報錯,可以需要強制轉換來通過編譯。這種用法一般用在建立的子類物件賦值給了父類的指標,再將父類的指標賦值給子類的指標。也就是該物件實際是子類的物件。如果是父類的物件,裡面是不包含子類的內容的,所以不能強制轉換為子類的指標,會發生不可預知的錯誤。可以使用dynamic_cast<>來轉換,如果轉換成功,會返回指標,如果轉換失敗,會返回nullptr.
3.繼承類之間位址的賦值可能會引起位址的變化,這個可能是編譯器自動給轉換了,比如如下的例子:
所以,假如乙個物件(*p)有多個父類介面a, b,當要獲得某個父類介面時,可以提供通過(a*)p
或者(b*)p
來轉化獲得,但不能通過(a*)b
來獲得。所以當某個物件有多個父類介面時,可以通過
get_inte***ce(inte***ce_type)函式來獲得對應的介面,實現如下:
void* get_inte***ce(inte***ce_type)
else if (inte***ce_type == b) else
}
class top
;class left : public top
;class right : public top
;class bottom : public left, public right
;void test_cpp_multi_inherit()
int main()
;// std::vectortest_vector(buffer, buffer + 4);
// for(auto &i : test_vector)
test_cpp_multi_inherit();
return 0;
//return a.exec();
}
關於多型和動態繫結,可以參考:
虛函式表的介紹:
每個類擁有乙個虛函式表,每個物件擁有乙個指向虛函式表的指標。
這篇文章介紹了c++類的記憶體結構,可以參考:
C 的繼承關係
建立名為vehicle 車 的基類,它含有製造商的名稱 string型別 發動機缸數 int 型別 以及車主 person型別 然後建立vehicle類的乙個派生類truck 卡車 它具有一些附加屬性,包括載重 double型別 單位 噸 和牽引力 int型別 單位 磅 類應具有合理的建構函式 取值...
C 繼承關係
繼承關係的 演示 class person public person string name,string int age,double weight public void eat double food class student person public void study double...
C 繼承關係
繼承和派生概述 繼承和派生是同乙個過程從不同角的度看 保持已有類的特性而構造新類的過程稱為繼承。在已有類的基礎上新增自己的特性而產生新類的過程稱為派生。被繼承的已有類稱為基類 或父類 派生出的新類稱為派生類 或子類 直接參與派生出某類的基類稱為直接基類。基類的基類甚至更高層的基類稱為間接基類。派生的...