c++继承,多态和存储对象

c++ inheritance, polymorphism and storing objects

本文关键字:存储 对象 多态 继承 c++      更新时间:2023-10-16

我得到了一个简单的赋值,一开始没有挑战性,但是让我头疼,我不能解决一个(两个?)问题,这是存储对象(没有切片)和得到想要的函数。

我认为这是多态性和虚拟化的问题,所以说:

我有一个类Vehicle:

class Vehicle 
{ 
protected: 
    int speed;
    int id;
public: 
    int getSpeed ();
    int getID();
};

和从它继承的类:

class SuperVehicle : public Vehicle
{
protected: 
    int acceleration; 
public:
    int getAcceleration();
    int getSomething();
    int setAcceleration(int number);
};

现在我的目标是获得所有车辆(包括超级车辆)的列表(或其他类型的存储),随机填充车辆或超级车辆,然后随机使用正确的方法,例如:

list<Vehicle*> listOfVehicles;
list<Vehicle*>::iterator VehiclesIterator;
for(int i = 0; i <5; i++)
{
    if (i % 2) listOfVehicles.push_back(new Vehicle());
    else listOfVehicles.push_back(new SuperVehicle());
}
while(true)
{
    randomVehicle = rand() % 5;
    for(VehiclesIterator = listOfVehicles.begin();
        VehiclesIterator != listOfVehicles.end(); VehicleIterator++)
    {
    if (VehicleIterator.getID() == randomVehicle) break;
    }
    if (randomVehicle % 2) randomFunction = rand() % 2;
    else randomFunction = rand() % 4;
    switch(randomFunction)
    {
    case 0: (*VehicleIterator)->getSpeed(); break;
    case 1: (...)
    case 2: (*VehicleIterator)->getAcceleration(); break
    case 3: (...)
    }
}

我不在乎作业。我只是想解这个,因为解这个花了我所有的时间。谢谢大家的回答。

假设我对pojazd的评论是Vehicle,并且问题是在派生类SuperVehicle中访问附加函数getAccelleration(等),那么解决方案是:

  1. 使基类具有一个在基类中"什么都不做"的虚函数。
  2. 使用dynamic_cast检查结果。

方案二示例:

SuperVehicle* sv = dyanmic_cast<SuperVehicle*>(*VehicleIterator);
if(sv)
{
    sv->getAcceleration();
}
else
{
    cout << "Not a supervehicle, don't try to get accelleration!" << endl;
}

通常,不赞成使用dynamic_cast(因为它实际上用一堆if语句破坏了代码流,特别是在有许多派生类的情况下)。最好拥有具有空/无操作函数和/或包装功能的基类,这样可以在没有强制类型转换和大量if语句的情况下维护泛型功能。