繁体   English   中英

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

[英]c++ inheritance, polymorphism and storing objects

给我一个简单的任务,起初并没有挑战性,但是却让我头疼,而且我无法解决一个(两个?)问题,即存储对象(不切片)并获得所需的功能。

我认为这既是多态性又是虚拟化的问题,因此:

我有一辆课车:

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

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

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: (...)
    }
}

我不在乎任务。 只想解决这个问题,因为思考解决方案需要花费我所有的时间。 欣赏所有答案。

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

  1. 使基类具有在基类中“不执行任何操作”的虚函数。
  2. 使用dynamic_cast并检查结果。

解决方案2的示例:

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语句的情况下维护通用功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM