有没有办法防止在子类中重写方法?

Ada*_*dam 28 c++ overriding metrowerks

是否有人知道C++中的语言特性或技术,以防止子类过度使用父类中的特定方法?

class Base {
public:
    bool someGuaranteedResult() { return true; }
};

class Child : public Base {
public:
    bool someGuaranteedResult() { return false; /* Haha I broke things! */ }
};
Run Code Online (Sandbox Code Playgroud)

尽管它不是虚拟的,但仍然允许这样做(至少在我正在使用的Metrowerks编译器中),所有你得到的是关于隐藏非虚拟继承函数X的编译时警告.

moo*_*eep 34

当您可以使用final虚拟方法的说明符(C++ 11引入)时,您可以这样做.让我引用我最喜欢的doc网站:

当在虚函数声明中使用时,final指定该函数不能被派生类覆盖.

适应你的例子:

class Base {
public:
    virtual bool someGuaranteedResult() final { return true; }
};

class Child : public Base {
public:
    bool someGuaranteedResult() { return false; /* Haha I broke things! */ }
};
Run Code Online (Sandbox Code Playgroud)

编译时:

$ g++ test.cc -std=c++11
test.cc:8:10: error: virtual function ‘virtual bool Child::someGuaranteedResult()’
test.cc:3:18: error: overriding final function ‘virtual bool Base::someGuaranteedResult()’
Run Code Online (Sandbox Code Playgroud)

当您使用Microsoft编译器时,还要查看sealed关键字.

  • 请注意(至少在 Visual C++ 中)如果将 const 方法标记为 Final,则它需要 const final 而不是 Final const。 (2认同)

OJ.*_*OJ. 13

一些想法:

  1. 让你的功能私密.
  2. 不要让你的功能虚拟化.这实际上并没有阻止该函数被另一个定义遮蔽.

除此之外,我不知道一种语言功能会以某种方式锁定你的功能,这种方式可以防止它被重载,并且仍然可以通过指向子类的指针/引用来调用它.

祝好运!

  • 请注意,C++ 11中添加了一个`final`说明符:http://stackoverflow.com/a/16906116/1025391 (8认同)
  • @moooeeeep Final 在这种情况下不起作用: `struct foo { void bar() Final; };` 不是合法的 C++ (2认同)

Dan*_*itt 6

听起来像你正在寻找的是相当于Java语言final关键字,它阻止一个方法被子类覆盖.

正如其他人在这里已经暗示,你真的不能避免这种情况.此外,这似乎是一个经常被问到的问题.

  • `final`关键字由C++ 11引入(http://en.cppreference.com/w/cpp/language/final).另请参阅此处的答案(http://stackoverflow.com/a/16896559/1025391). (4认同)