在每个派生类中重新定义一个虚方法

问题描述

我发现了很多类似的帖子,但没有一个明确回答我的问题,所以这里是:

假设我有一个 Country 类,它实例化了 City 类的一个对象,而后者有两个子类 House 和 Station。 在 City 类中,我声明了一个 virtual void method color(),它为房屋而不是车站着色。只有类 House 具有 color 属性。 我在我的 House 子类中重新定义了这个方法

void color() override
{ // color my house 
 color_ = blue;
}

在编译时,如果我调用city_.color()(假设房屋和车站已经在该国实例化),我将收到一个错误,表明color() 方法未在车站重新定义{ {1}}。我该怎么办,因为我只想给房子上色。 我是否也应该在 station 中重新定义 subclass 方法但将其留空?

换句话说:在父类中声明虚函数时,是否每个子类都必须重新定义它? 谢谢!

这是一个最小的代码(没有功能只是一个例子):

color()

解决方法

您不需要在每个子类中重新定义函数,但确实需要在基类中定义(在本例中为 City)。

一个愚蠢(但有效)的默认实现如下所示:

class City {
City(Position const& country);

void virtual setHouseColor(Color color) { };
};

您可能需要更智能的默认实现,具体取决于您要执行的操作。

请注意,在某些情况下,您需要所有子类来实现 setHouseColor 方法,如果您将其声明为“纯虚拟”:

class City {
City(Position const& country);

void virtual setHouseColor(Color color) = 0;
};

这会将 City 标记为“抽象”类,在这种情况下,每个派生类都需要实现所有声明的纯虚方法。

这两种方法都说明了 C++ 的一个重要特性:在运行时不检查类方法的有效性,因此编译器必须强制执行某种保证,即当调用虚拟方法时,将有一个有效的条目在 vtable 中。