如果重写方法不调用 C++ 中的重写实现,是否有办法发出警告?

Hug*_*l31 0 c++ oop inheritance

如果重写方法不调用被重写的方法,是否有一个函数属性(标准或编译器扩展)会发出警告?

像这样:

class A
{
protected:
    [[please_call]]
    virtual void foo() { /* ... */ };
};

class B : public A
{
protected:
    void foo() override {}
    // WARNING: B::foo() does not call A::foo()
};
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

实现此目的的一种方法是使用基类中的另一个函数并调用该函数中的虚函数。那看起来像

class Base
{
public:
    void doFoo() { Base::doFooImpl(); doFooImpl(); }
private:
    virtual void doFooImpl() { std::cout << "Base\n"; }
};

class Derived : public Base
{
private:
    void doFooImpl() override { std::cout << "Dervied\n"; }
};

int main()
{
    Derived d;
    d.doFoo();
}
Run Code Online (Sandbox Code Playgroud)

输出:

Base
Derived
Run Code Online (Sandbox Code Playgroud)

实例


n. *_* m. 5

有一种方法可以做类似的事情。

class A
{
  public:
    class fooRet
    {
      fooRet() {}
      friend class A;
    };    
  protected:
    virtual fooRet foo() { /* ... */ return {} };
};
Run Code Online (Sandbox Code Playgroud)

现在 的任何重写者都foo必须返回 a fooRet,但是除了调用 之外没有其他方法可以获取它A::foo()