我有一个基类和一个派生类,我试图实现一个虚拟加载函数来向SportCar类添加一个额外的成员engineSize,它应该加载Car类中包含的基本汽车细节,即CarName,Color等但也包括engineSize,这是SportsCar类独有的。但它似乎没有很好的锻炼。下面我已经包含了我的代码。目前,它只是默认包含在默认构造函数中的详细信息,即“未知”。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Car
{
public:
Car();
virtual void Load(ifstream& carFile);
int LoadString(string filename);
protected:
string CarName;
int Age;
string Colour;
double Price;
int countUsers;
Car *ptrToCarList;
};
class SportsCar : public Car
{
public:
SportsCar();
virtual void LoadSports(ifstream& carFile);
int LoadString(string filename);
void display();
protected:
int engineSize;
SportsCar *ptrToSportsCarList;
int countUsers;
};
Car::Car()
{
CarName = "Unknown";
countUsers = 2;
}
void Car::Load(ifstream& carFile)
{
carFile >> CarName >> Age >> Colour >> Price;
}
int Car::LoadString(string filename)
{
ifstream inFile(filename);
if (!inFile)
{
cout << "Sorry, file not found" << endl;
return -1;
}
ptrToCarList = new Car[countUsers];
for (int i = 0; i < countUsers; i++)
{
ptrToCarList[i].Load(inFile);
}
inFile.close();
return 0;
}
void SportsCar::display()
{
cout << CarName << " " << Age << " " << Colour << " " << Price << " " <<engineSize <<endl;
}
void SportsCar::LoadSports(ifstream& carFile)
{
Car::Load(carFile);
carFile >> engineSize;
}
SportsCar::SportsCar() :Car()
{
}
int SportsCar::LoadString(string filename)
{
ifstream inFile(filename);
if (!inFile)
{
cout << "Sorry, file not found" << endl;
return -1;
}
ptrToSportsCarList = new SportsCar[countUsers];
for (int i = 0; i < countUsers; i++)
{
ptrToSportsCarList[i].LoadSports(inFile);
}
inFile.close();
return 0;
}
int main()
{
SportsCar example2;
example2.LoadString("sportsCarFile.txt");
example2.display();
return 0;
}
答案 0 :(得分:0)
如果你想在汽车中装许多车意味着这种设计有些不对劲。
考虑制作类Garage;)
example2.LoadString("sportsCarFile.txt");
没有按预期调用LoadSports
因为countUsers为0.因为在派生类中你有声明隐藏了Car的构造函数的初始化。
您有ptrToSportsCarList
和ptrToCarList
。由于可以在LoadSports函数上使用的多态性,您可能只需要ptrToCarList
来保存汽车
考虑将LoadSports移动到Base类并将其重命名为更通用,并将其设置为虚拟,因此可以从ptrToCarList
调用,而不是从pt中提到的ptrToSportsCarList
调用。 2。