我之前问过类似的问题,但是删除了它,因为我无法提出一个具体的例子。我现在能提出一个。我经常发现自己在设计代码,使得虚函数仅在某些子类中有用,而在所有子类中不有用。
这里是由travel
和driving
继承的基类flying
的示例。 travel
具有计算速度和高度的compute_travel_info()
功能。前者与驾驶和飞行有关,而后者仅与飞行有关。
[在此设计中,driving::compute_altitude()
不执行任何操作,但是我们必须对其进行定义,因为该函数是纯虚函数(我可以选择在travel
中将其设为虚函数并对其进行定义,然后在driving
中不进行覆盖) 。同样,理想情况下,如果它在compute_altitude()
对象上运行,我什至都不希望在compute_travel_info
中调用driving
函数,因此该代码似乎会误导其编写方式。
我认为这是不好的做法吗?拥有一个在子类之一中没有用的虚函数并调用在某些子类中未使用的虚函数,这会让人皱眉吗?
请注意,这只是一个特定的示例,理想情况下,我想要一个适用于一般情况的答案,而不仅限于所提供的特定示例。换句话说,我不希望读者对这个例子过于关注。
class travel
{
public:
//function for representing the state in bits
void compute_travel_info()
{
compute_velocity();
compute_altitude();
}
private:
double velocity;
virtual void compute_velocity() = 0;
virtual void compute_altitude() = 0;
};
class flying : domain
{
void compute_velocity()
{
//compute the velocity
}
void compute_altitude()
{
//compute the altitude
}
};
class driving : travel
{
void compute_velocity()
{
//compute the velocity
}
void compute_altitude()
{
//do nothing (assume car is driving on a flat earth where altitude doesn't change)
}
};
我之前问过类似的问题,但删除了它,因为我无法提出一个具体的例子。我现在能提出一个。我经常发现自己设计的代码使得虚拟...
[compute_altitude
显然不应该是您的虚拟接口的一部分,因为如果在派生类中将其实现为存根,则不能保证通过基指针调用它会做任何合理的事情。
您可以在飞行中添加对compute_travel_info函数的替代。