是否可以确定/断言,如果一个虚拟函数被覆盖,另一个也被覆盖

Is it possible to determine/assert, that if one virtual function gets overridden, another one is overridden too?

本文关键字:覆盖 一个 虚拟 函数 另一个 是否 如果 断言      更新时间:2023-10-16

我有一个现有的类,它声明了一个虚拟方法并定义了一个默认实现。现在,我想用一个不同的参数重载该方法,并给出一个默认实现。此外,我想强制执行约束,如果第一个方法被子类覆盖,那么第二个(重载的)虚拟方法也必须被覆盖。

这在C++内部可能吗?如果是,在编译时是否可能?

示例代码:

class ParamA {};
class ParamB {};
class Base
{
public:
    virtual void method(ParamA a)
    {
        // default behavior
    }
    virtual void method(ParamB b)
    {
        // default behavior
    }
}
class Derived : public Base
{
public:
    virutal void method(ParamA)
    {
        // special behavior
    }
}

我的目标是检测类型为Derived的类,并强制它们实现它们的method(ParamB b)版本。

否,不能指定必须重写哪些成员函数集的复杂约束。唯一的限制适用于个别职能;纯虚拟(=0)来强制重写,以及(在C++11中)final来防止重写。

你能做的最好的事情就是让这两个函数都是纯虚拟的,强制派生类覆盖这两个。这至少迫使派生类的作者思考什么需要重写;不可能覆盖其中一个而忘记另一个。

您仍然可以提供默认实现,这样不想重写任何一个函数的派生类只需要调用默认版本的非常短的重写。

我认为C++没有提供任何方法来检测子级中丢失的覆盖。

@larsmans:将这两个方法都设为纯虚拟会导致丢失默认实现。

@js:你能详细谈谈你的实际问题吗?我似乎不太清楚你在搜索什么。

创建一个Base将从中继承的Parent类怎么样?这两个函数在Parent类中将是纯虚拟的。派生类将继承Parent(而不是Base),并且必须实现这两个函数。

如果您只需要处理父类,那么不可以。无论是在编译时还是在运行时检查时,这都是不可能的。

当然,你可以引入一些宏(比如OVERRIDE_METHODS……我相信你明白我在说什么),但没有什么能阻止用户忽略它们,只覆盖其中一个方法。

另外,这样的宏会让代码变得非常难看。