[英]c++ Using subclasses
我有這個變量; 家具**家具; 這是2個子類,Bookcase和Couch的抽象基類。 我隨機添加這些;
furnitures[n++] = new Bookcase ();
furnitures[n++] = new Couch();
.
.
為了解釋。 讓我們設置一些小變量。 私人家具:名稱,獎項私人書櫃:大小沙發私人:座位
如果我想打印出諸如此類的信息,我將如何進行; 名字和座位?
這個問題有很多問題。 1,區分哪個子類是什么時候我使用Furniture [i]。 2,我不想在不需要的兩個子類之間混合太多不必要的函數。
class Furniture
{
virtual void output() = 0;
};
class Couch : public Furniture
{
void output() override;
};
class Bookshelf : public Furniture
{
void output() override;
};
您可以在Furniture中定義函數以從子類中的重復代碼中保存,如下所示:
void Furniture::output()
{
// We assume here the output is to cout, but you could also pass the necessary
// stream in as argument to output() for example.
cout << name << price;
}
void Couch::output()
{
Furniture::output();
cout << seats;
}
void Bookshelf::output()
{
Furniture::output();
cout << size;
}
你永遠不應該以多態方式使用數組 。 閱讀Scott Meyers的“ 更有效的C ++”一書中的第一項(我認為這是第一項),找出原因!
事實上,你幾乎不應該在C ++中使用原始數組。 一個正確的解決方案是使用std::vector<Furniture*>
。
如果我想打印出諸如此類的信息,我將如何進行; 名字和座位?
這個問題有很多問題。 1,區分哪個子類是什么時候我使用Furniture [i]。 2,我不想在兩個不需要的子類之間混合太多不必要的函數。
您正面臨這個問題,因為您正在濫用面向對象的編程。 這很簡單:當不同類型實現抽象公共操作並且在運行時選擇具體類型時,面向對象編程是有意義的。 在您的情況下,沒有共同的操作。 打印(或接收)數字座位是一種類型,打印(或接收)的尺寸是另一種類型。
這並不是說這是壞事還是錯誤,但它根本不是面向對象的。
現在C ++不會是C ++,如果它沒有為你提供一個危險的工具來擺脫你自己編碼的每一個死胡同。 在這種情況下,您可以使用運行時類型標識(RTTI)來查找對象的具體類型。 谷歌的typeid
和dynamic_cast
,你會很快找到解決方案。 但請記住,使用RTTI解決此問題是一種解決方法 。 檢查您的課程設計,並在必要時進行更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.