问题描述
我发现了很多类似的帖子,但没有一个明确回答我的问题,所以这里是:
假设我有一个 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 中。