【问题标题】:C++ inheritance class virtual functionsC++继承类虚函数
【发布时间】:2015-06-23 06:22:58
【问题描述】:

我有一个基类和一个派生类,我正在尝试实现一个虚拟加载函数来向 SportCar 类添加一个额外的成员 engineSize,它应该加载 Car 类中包含的基本汽车细节,即 CarName、Color 等还包括 SportsCar 类独有的 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;
}

【问题讨论】:

  • 您真的需要在 SportsCar 中使用相同的变量 countUsers 吗? SportsCar::LoadString 函数使用未初始化的 countUsers。您正在初始化 countUsers 但来自 Car 类
  • 根据您所做的,您认为example2.LoadString("sportsCarFile.txt"); 做了什么?我的意思是,代码是做什么的,而不是你想要它做什么。
  • 你的基类Car应该有一个虚拟析构函数。
  • 为什么一辆车同时包含汽车信息和汽车集合?我的车完全不知道其他车。
  • LoadString 也应该是虚拟的。

标签: c++ function class inheritance virtual


【解决方案1】:

如果您想在汽车中容纳许多汽车,这意味着该设计有问题。

  1. 考虑制作车库类;)

  2. example2.LoadString("sportsCarFile.txt"); 没有像您期望的那样调用 LoadSports,因为 countUsers 为 0。因为在派生类中,您有声明隐藏了 Car 的构造函数的初始化。

  3. 你有ptrToSportsCarList 和ptrToCarList。您可能只希望 ptrToCarList 持有汽车,因为您可以在 LoadSports 函数上使用多态性

  4. 1234563 2.

【讨论】:

  • 感谢您的回复,如果我有一个 Garage 类来处理所有汽车的装载和分类,我将如何仅在汽车类中显示一辆车。 @userbb
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2015-08-23
  • 2015-08-07
  • 1970-01-01
  • 2013-01-27
  • 2012-04-22
相关资源
最近更新 更多