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

js_*_*js_ 6 c++ virtual inheritance

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

这在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
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是检测类型Derived并强制执行它们的版本method(ParamB b).

Mik*_*our 5

不,您不能指定必须覆盖哪些成员函数集的复杂约束.唯一的限制适用于个别职能; pure virtual(=0)用于强制覆盖,(在C++ 11中)final用于防止覆盖.

您可以做的最好的事情是使两个函数都是纯虚拟的,强制派生类重写两者.这至少迫使衍生类的作者思考什么需要压倒一切; 它是不可能覆盖一个而忘记另一个.

您仍然可以提供默认实现,因此不希望覆盖任一函数的派生类只需要调用默认版本的非常短的覆盖.