C++继承、多态和存储对象

C++继承、多态和存储对象,c++,list,inheritance,polymorphism,storage,C++,List,Inheritance,Polymorphism,Storage,我被分配了一个简单的任务,一开始并不具有挑战性,但却让我头疼,我无法解决其中的一个和两个?问题,即存储对象时不进行切片并获取所需的函数 我认为这是一个多态性和虚拟化的问题,因此,说到这里: 我有一辆高级车: class Vehicle { protected: int speed; int id; public: int getSpeed (); int getID(); }; 以及从中继承的类: class SuperVehicle : public

我被分配了一个简单的任务,一开始并不具有挑战性,但却让我头疼,我无法解决其中的一个和两个?问题,即存储对象时不进行切片并获取所需的函数

我认为这是一个多态性和虚拟化的问题,因此,说到这里:

我有一辆高级车:

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是车辆的评论,并且问题是访问派生类SuperVehicle中的附加函数GetAcceleration等,那么解决方案是:

使基类具有一个在基类中不执行任何操作的虚拟函数。 使用动态_cast并检查结果。 解决方案2的示例:

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

通常,人们不赞成使用动态_cast,因为它本质上用一堆if语句破坏了代码流,特别是当有许多派生类时。最好让基类具有空/无op函数和/或包装功能,这样可以在不使用强制转换和大量if语句的情况下维护通用功能

那么你的确切问题是什么呢?虚拟成员函数就是要得到正确的函数这不起作用,迭代器没有显示SuperVehicle的方法,只有基类的方法,因为它可能是基于迭代器的类型进行切片的。因为您想在一个列表中存储不相关的类:看看boost::Any没有必要使用虚拟函数,因为派生类中没有重写的函数来使用动态转换,所以我必须有一个虚拟函数,我就是这样做的。我在基类中制作了一个虚拟函数print;-它什么也不做。然而,在成功应用动态强制转换后,我得到一个错误:调试断言失败。。。表达式:列表迭代器不可取消引用,因此“总括”-未成功。