C ++基类加载函数

时间:2015-04-12 19:42:00

标签: c++ class ifstream base

我有一个基类汽车和一个加载函数,如果我有一个派生类,我可以使用基类的加载函数,并添加额外的数据成员,如运动车的引擎大小,从文件加载。以下是我的功能定义。

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

2 个答案:

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