C++继承类虚函数

C++继承类虚函数,c++,function,class,inheritance,virtual,C++,Function,Class,Inheritance,Virtual,我有一个基类和一个派生类,我试图实现一个虚拟加载功能,向SportCar类添加一个额外的成员engineSize,它应该加载汽车类中包含的基本汽车细节,即卡纳姆、颜色等,但也包括SportCar类特有的engineSize。但它似乎锻炼得不好。下面是我的代码。目前,它只是默认为默认构造函数中包含的细节,即未知 #include "stdafx.h" #include <iostream> #include <fstream> #include <string>

我有一个基类和一个派生类,我试图实现一个虚拟加载功能,向SportCar类添加一个额外的成员engineSize,它应该加载汽车类中包含的基本汽车细节,即卡纳姆、颜色等,但也包括SportCar类特有的engineSize。但它似乎锻炼得不好。下面是我的代码。目前,它只是默认为默认构造函数中包含的细节,即未知

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

如果你想在车里放很多车,这意味着这种设计有些问题

考虑在车库里上课

示例2.LoadStringsportsCarFile.txt;未按预期调用LoadSports,因为countUsers为0。因为在派生类中有一个声明,该声明对Car的构造函数隐藏初始化

你有ptrToSportsCarList和PTRTOCALIST。您可能只想让ptrToCarList持有车辆,因为您可以使用on LoadSports功能

考虑将LoadSports移动到基类,并将其重命名为更通用的,并使其虚拟化,以便可以从ptrToCarList调用,而不是像pt中提到的那样从ptrToSportsCarList调用。二,


跑车中是否真的需要相同的变量countUsers?SportsCar::LoadString函数使用未初始化的countUsers。您正在初始化countUsers,但从Car类根据您所做的操作,您认为example2.LoadStringsportsCarFile.txt;做我的意思是,代码做什么,而不是你想要它做什么。你的基类车应该有一个虚拟析构函数。为什么一辆车同时包含一辆车和一组车的信息?我的车完全不知道还有其他车。LoadString也应该是虚拟的。感谢您的回复,如果我有一个车库类来处理所有车的装载和分类,我将如何在car类中只显示一辆车@用户BB