我有一個基類的汽車和一個加載函數,如果我有一個派生類,我可以使用基類中的加載函數,並添加額外的數據成員,如跑車的引擎大小從文件加載。以下是我的功能定義。C++基類加載函數
void Car::Load(ifstream& carFile)
{
carFile >> CarName >> Age >> Colour >> Price;
}
我有一個基類的汽車和一個加載函數,如果我有一個派生類,我可以使用基類中的加載函數,並添加額外的數據成員,如跑車的引擎大小從文件加載。以下是我的功能定義。C++基類加載函數
void Car::Load(ifstream& carFile)
{
carFile >> CarName >> Age >> Colour >> Price;
}
「我可以使用load函數從基類,並添加額外的數據成員,如發動機尺寸從文件加載跑車。」
如果函數聲明爲類virtual
Car
你可以重寫,並在派生類擴展
class Car {
public:
virtual void Load(istream& carFile);
};
class SportsCar : public Car {
public:
virtual void Load(istream& carFile);
private:
int EngineSize;
};
void SportsCar::Load(istream& carFile)
{
Car::Load(carFile);
carFile >> EngineSize;
}
注意我有我的代碼示例中使用std::istream
,因爲它不是如果流來自這些代碼部分的文件,則是相關的。
你可能需要對汽車類型鑑別文件中(std::istream
分別),來決定哪些類實際上應該被實例化:
class CarFactory {
public:
static Car* LoadCarFromStream(istream& carStream) {
string carType;
Car* carResult = nullptr;
if(carStream >> carType) {
if(carType == "Car") {
carResult = new Car();
}
else if(carType == "SportsCar") {
carResult = new SportsCar();
}
}
if(carResult) {
carResult->Load(carStream);
}
return carResult;
}
};
是的,你可以:
class Car{
public:
virtual void Load(ifstream& carFile);
}
Load方法是虛擬的,這一點很重要。
class SportsCar : public Car{
public:
virtual void Load(ifstream& carFile);
private:
int engineSize;
}
這裏的方法重寫,所以你使用繼承
SportsCar::Load(ifstream& carFile){
Car::Load(carFile);
carFile >> engineSize;
}
及以上的實施。
如果我聲明一個int SportsCar :: Load(string fromFilename)來加載文件,我該如何使用這個虛函數。 @Philip Stuyck – BeginnerLK
SportsCar sportscar; sportscar.Load( 「文件名」); –
是的,如果它是虛擬的,你可以重寫並調用父對象來首先執行基本對象,然後爲派生類的特定字段做額外的事情。 –