我從這里學習 OOP 。
它說在 C 中使用資料成員可以實作運行時多型性。
現在,考慮這段代碼: -
#include <iostream>
using namespace std;
class Animal { // base class declaration.
public:
string color = "Black";
};
class Dog: public Animal // inheriting Animal class.
{
public:
string color = "Grey";
};
int main(void) {
Animal d= Dog();
Animal d1 = Animal();
cout<<d.color<<endl;
cout<<d1.color<<endl;
}
在上述兩種情況下,都會列印顏色“黑色”。那么,這個運行時多型性的例子是怎樣的呢?
uj5u.com熱心網友回復:
這個運行時多型性的例子如何?
它不是運行時多型性的例子,而是物件切片的例子。
這就是為什么在這樣的在線網站上推薦一本好的 C 書籍的原因之一。
也就是說,第一選擇/偏好應該始終是(假設您想深入了解該主題)一本好書。然后,只有在閱讀完本書中的主題后,您才能在網站上查找相同的實際示例。如果您想參考合法的 C 檔案站點,可以參考cppreference和learncpp。這兩個站點是 C 專用站點,因此您可以依賴那里提供的大部分資訊/示例。再次建議先參考一本書。
uj5u.com熱心網友回復:
如果這是運行時多型性,您可以撰寫一個函式:
void foo(Animal& a) {
std::cout << a.color << "\n";
}
它會根據引數的動態型別列印物件的相應顏色。但是,C 中沒有“基于成員變數的運行時多型性”之類的東西。該教程是錯誤的和誤導性的。
如果編譯并執行這個:
#include <iostream>
using namespace std;
class Animal { // base class declaration.
public:
string color = "Black";
};
class Dog: public Animal // inheriting Animal class.
{
public:
string color = "Grey";
};
void foo(Animal& a) {
std::cout << a.color << "\n";
}
int main(void) {
Dog d= Dog();
Animal d1 = Animal();
foo(d);
foo(d1);
}
輸出將是
Black
Black
沒有虛擬成員變數之類的東西。僅對于虛擬成員函式使用虛擬調度:
#include <iostream>
using namespace std;
class Animal { // base class declaration.
public:
virtual std::string color() const { return "Black"; }
};
class Dog: public Animal // inheriting Animal class.
{
public:
std::string color() const override { return "Grey"; }
};
void foo(Animal& a) {
std::cout << a.color() << "\n";
}
int main(void) {
Dog d= Dog();
Animal d1 = Animal();
foo(d);
foo(d1);
}
輸出:
Grey
Black
當它說會有帶有成員變數的運行時多型性時,它是錯誤的并且具有誤導性。此外,他們提供的示例具有物件切片功能。請參閱此處:什么是物件切片?.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496387.html
