我有一个基类汽车和一个加载函数,如果我有一个派生类,我可以使用基类的加载函数,并添加额外的数据成员,如运动车的引擎大小,从文件加载。以下是我的功能定义。
void Car::Load(ifstream& carFile)
{
carFile >> CarName >> Age >> Colour >> Price;
}
答案 0 :(得分: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;
}
以上是实施。
答案 1 :(得分: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;
}
};