我得到了一个简单的任务,一开始并没有挑战,但让我头疼,我无法解决一个(两个?)问题,即存储对象(没有切片)和到达想要的功能。
我认为这是多态性和虚拟化的问题,所以要点:
我有一类车辆:
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)的列表(或其他类型的存储),随机填充车辆或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: (...)
}
}
我不关心作业。只是想解决这个问题,因为对解决方案的思考需要我所有的时间。感谢所有答案。
答案 0 :(得分:3)
假设我对pojazd
为Vehicle
的评论,以及问题是在派生类getAccelleration
中访问其他函数SuperVehicle
(等),那么解决方案是要么:
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语句的情况下维护通用功能。