2015-04-12 2 views
0

У меня есть базовый класс автомобилей и функция загрузки, если у меня есть производный класс, могу ли я использовать функцию загрузки из базового класса и добавлять дополнительные элементы данных, такие как размер двигателя для спортивных автомобилей, чтобы загружаться из файла. Ниже приведено определение моей функции.Функция загрузки базового класса C++

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

Да, если это виртуально, вы можете переопределить и вызвать родителя, чтобы сначала сделать базовый материал, а затем сделать дополнительные вещи для определенных полей производного класса. –

ответ

2

«можно использовать функцию загрузки из базового класса и добавить дополнительные элементы данных, такие как размер двигателя для спортивных автомобилей, которые будут загружены из файла.»

Если функция объявлена ​​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; 
    } 
}; 
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 ("имя_файла"); –