【发布时间】:2019-12-11 18:06:21
【问题描述】:
考虑以下抽象类,它将是一个类的接口,该类将某个对象携带的信息写入标准输出。
class FileBuilder
{
public:
virtual void build(const Object& object) = 0;
virtual ~FileBuilder() = default;
};
此时我会注意到Object 也是一个抽象类,派生类SpecialObject。现在我要实现SpecialFileBuilder : FileBuilder,如下。
class SpecialFileBuilder : public FileBuilder
{
public:
void build(const SpecialObject& specialObject);
};
...
void SpecialFileBuilder::build(const SpecialObject& specialObject)
{
// Do some stuff
}
我不完全理解为什么这是不可能的。 SpecialFileBuilder 尊重接口FileBuilder,并且在任何期望FileBuilder 的地方都可以改为SpecialFileBuilder。提前感谢您的帮助。
当然,如果我将内容更改为以下内容,这将起作用。
void SpecialFileBuilder::build(const Object& object)
但是,在我的SpecialFileBuilder::build() 实现中,我需要使用参数是SpecialObject,而不仅仅是Object。
我应该如何处理这种设计?
【问题讨论】:
-
该语言有一个非常简单的工具可以用来自己找出答案:override 说明符。只需用
override标记覆盖函数 - 如果它编译,那么你的答案是“是”,否则它是“否”。顺便说一句:我建议在应该覆盖基类函数的 all 函数上使用override。当您错过签名时,它有助于发现错误。 -
(+1) 好建议。在使用 C/C++ 之后,对于您提出的问题,我多次将此功能明确添加到 P.L.我正在设计。
标签: c++ oop inheritance abstract-class pure-virtual