当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《有没有办法防止在子类中重写方法?》经验,为你挑选了3个好方法。

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

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

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

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



1> moooeeeep..:

当您可以使用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! */ }
};

编译时:

$ 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()’

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



2> OJ...:

一些想法:

    让你的功能私密.

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

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

祝好运!


请注意,C++ 11中添加了一个`final`说明符:http://stackoverflow.com/a/16906116/1025391

3> Danny Whitt..:

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

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


`final`关键字由C++ 11引入(http://en.cppreference.com/w/cpp/language/final).另请参阅此处的答案(http://stackoverflow.com/a/16896559/1025391).
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有