您可以通过虚拟方式或非虚拟方式进行操作。但要回答其中哪一个是最好的,让我们看看你的例子:
class Bicycle: public BaseVehicle
{
public:
Bicycle(VehicleTable& table, Number number): BaseVehicle(table, number) {}
virtual float getMaxSpeed() const { return 40.0f; } // constant
virtual float getWeight() const { return 10.0f; } // constant
virtual float getLength() const { return 2.3f; } // constant
virtual int getWheels() const { return 2; } // constant
};
这些函数中的每一个都返回一个常量,但仍需要虚拟调用才能获得该常量。这是不好的做法,因为您需要执行(昂贵的)虚拟调用来获取每个值。
更好的方法:使用struct
相反,最好将这些常量传递给父类的构造函数并将常量存储在基类中。这样,您根本不需要访问BaseVehicle 的vtable,只需在基类中直接访问它们即可。像这样:
struct VehicleStats {
float maxSpeed;
float weight;
float length;
int wheels;
};
// BaseVehicle's constructor now becomes this:
BaseVehicle(VehicleTable& table, Number number, VehicleStats stats)
或者,您可以在BaseVehicle 中只创建一个virtual 函数:
virtual VehicleStats getStats() const = 0;
这肯定比创建四个单独的函数要好。
替代方法:使用enum
您还可以将代表车辆类型的enum 传递给父级。例如:
enum class VehicleType {
BICYCLE,
CAR
};
// BaseVehicle's constructor now becomes this:
BaseVehicle(VehicleTable& table, Number number, VehicleType stats)
然后您可以全局存储统计信息:
static const std::map<VehicleType, VehicleStats> globalStatsMap;
如果您有大量统计数据并且不想增加基类的内存大小,这是一个非常好的方法。您现在也根本不需要BaseVehicle 的实例,仍然可以根据类型查找属性。