我最近開始學習 OOP。如果這是一個菜鳥問題,請原諒我。我的問題是,我認為 new 關鍵字僅用于相同的資料型別,例如:
char* p = new char; // OR
int* myArr = new int[i] //etc...
在學習繼承和虛函式時,我遇到了這個:
#include <iostream>
using namespace std;
class Human {
public:
virtual void className() {
cout << "Human" << endl;
}
};
class Asian : public Human {
public:
void className() {
cout << "Asian" << endl;
}
};
int main() {
Human* h1 = new Asian();
h1->className();
}
在main函式中,我們用基類初始化指標,然后new關鍵字后面是派生類?這兩種資料型別代表什么,我應該如何使用它們?
uj5u.com熱心網友回復:
請注意,在您的情況下,該類Human是可訪問的類Asian和
11.2 美元/5 州 -
如果基類是可訪問的,則可以將指向派生類的指標隱式轉換為指向該基類的指標 (4.10, 4.11)。[注意:因此類 X 的成員和朋友可以將 X* 隱式轉換為指向 X 的私有或受保護的直接基類的指標。--尾注]
根據以上參考的陳述句,你可以將指標轉換為派生類Asian的指標的基類Human(從手段Asian*到Human*),這是你做了什么,當你寫的:
Human* h1 = new Asian();
在上面的陳述句中,在左側我們有一個名為h1type的指標Human,在右側new我們使用關鍵字Asian在堆上創建一個 type 的物件。但請注意, usingnew有第二個效果,即在Asian堆上創建型別物件后,會回傳指向該物件的指標。所以基本上,在右手邊我們得到一個指向Asian(亞洲*)的指標。
現在,正如我在答案開頭已經解釋(參考)的那樣,您可以將指標轉換為指向此處發生的情況Asian的指標Human。
現在當你寫道:
h1->className();
您必須考慮以下 3 個重要事實:
className是一個虛函式/方法h1是一個指標AsianHuman公開繼承
并根據虛擬功能檔案
虛函式是您可以為其他派生類重新定義的成員函式,并且可以確保編譯器將為相應派生類的物件呼叫重新定義的虛函式,即使您使用指向基類的指標或參考呼叫該函式物件的類。
結果是className在運行時呼叫了名為派生類的函式,我們Asian在控制臺上看到了列印。
uj5u.com熱心網友回復:
這就是使用 OOP 的優勢。假設你有一家汽車廠,你生產轎車、掀背車等等。它們都是汽車,所以它們有四個輪子、發動機等等。為了不要多次擁有相同的資料,可以使用繼承。父類和子類都可以相互轉換,但讓您理解的一個例子是,假設您有一個修改汽車的類。由于我沒有指定汽車的型別,它可以是轎車或掀背車,而不是有 2 個不同的功能,您可以有一個接受父物件(汽車)的功能。
virtual關鍵字指定函式的子版本應該運行而不是父版本。因此,在您的示例中,由于我們正在制作一個Asian物件,因此我們將呼叫className. 如果沒有virtual關鍵字,則父版本將運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/378730.html
上一篇:僅將唯一值推送到陣列(無重復值)
