【问题标题】:c++ inheritance, polymorphism and storing objectsc++继承、多态和存储对象
【发布时间】:2014-03-09 11:36: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);
};

现在我的目标是获取所有车辆(包括 SuperVehicles)的列表(或其他类型的存储),用 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: (...)
    }
}

我不关心任务。只想解决这个问题,因为思考解决方案需要我所有的时间。感谢所有答案。

【问题讨论】:

  • 那么您的具体问题是什么?
  • 虚拟成员函数正是关于“获得正确的函数”
  • 这不起作用,迭代器没有显示 SuperVehicle 的方法,只显示基类的方法,因为它可能正在切片(基于迭代器的类型)。
  • 既然你想将不相关的类存储在一个列表中:看看 boost::any
  • 不需要虚函数,因为派生类中没有被覆盖的函数

标签: c++ list inheritance polymorphism storage


【解决方案1】:

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

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

【讨论】:

  • 要使用 dynamic_cast 我必须有一个虚函数,所以我做到了。我在基类中做了一个虚函数 print(); - 它什么都不做。但是,在应用动态转换(成功)后,我收到错误:“调试断言失败!(...)表达式:列表迭代器不可取消引用”(所以总而言之 - 不成功)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多