2015-04-12 72 views
0

我有一個基類的汽車和一個加載函數,如果我有一個派生類,我可以使用基類中的加載函數,並添加額外的數據成員,如跑車的引擎大小從文件加載。以下是我的功能定義。C++基類加載函數

void Car::Load(ifstream& carFile) 
{ 
    carFile >> CarName >> Age >> Colour >> Price; 
} 
+0

是的,如果它是虛擬的,你可以重寫並調用父對象來首先執行基本對象,然後爲派生類的特定字段做額外的事情。 –

回答

2

「我可以使用load函數從基類,並添加額外的數據成員,如發動機尺寸從文件加載跑車。」

如果函數聲明爲類virtualCar你可以重寫,並在派生類擴展

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; 
    } 
}; 
3

是的,你可以:

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; 
} 

及以上的實施。

+0

如果我聲明一個int SportsCar :: Load(string fromFilename)來加載文件,我該如何使用這個虛函數。 @Philip Stuyck – BeginnerLK

+0

SportsCar sportscar; sportscar.Load( 「文件名」); –