2

作为这个问题的后续:如果我创建一个纯虚拟接口类并将实现类拆分为头文件和源文件,我会得到以下信息:

界面:

class IDemo
{
    public:
        virtual ~IDemo() {}
        virtual void OverrideMe() = 0;
};

实现类,标题:

class Child : public IDemo
{
    public:
       virtual void OverrideMe();
};

实现类,来源:

void Child::OverrideMe() 
{
    //doStuff
}

所以我需要将接口中声明的方法的名称重复 3 次——这不仅麻烦,而且令人困惑。有没有更好的方法来做到这一点?

4

2 回答 2

4

没有办法避免这种情况(除非您在头文件中编写定义,正如其他人已经建议的那样;正如 Botz3000 也建议的那样 - 不要这样做)。

这就是这样做的方法。


根据您的评论,我决定写一个答案:

我:

什么如此令人困惑

你:

如果有人查看标题,他怎么知道这个方法声明实际上是从基类继承的

好吧,有两种方法 - 发表评论,例如:

/*
 * This overrides Base::OverrideMe
 */
virtual void OverrideMe();

当您将鼠标光标放在评论上时,大多数编辑都会向您显示此评论。

另一种方法是使用C++11, 在函数后添加override关键字:

class Child : public IDemo
{
    public:
       virtual void OverrideMe() override;
};

这对于其他情况也可能有用。您可能希望查看有关 C++11 的 wiki 文章的这一部分:override

另请参阅:'override' 关键字是否只是检查覆盖的虚拟方法?

于 2013-03-28T08:57:17.370 回答
2

不,没有什么好的办法。
接口必须指定方法,因为它是其契约的一部分。
标头必须指定方法,以声明该类覆盖它。
源文件必须指定方法,以便编译器知道实现属于哪个方法。我不觉得这令人困惑。

将出现次数减少到两次的唯一方法是在类的标题中实现该方法,但我强烈反对这种做法。

于 2013-03-28T08:49:42.800 回答