首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法防止方法在子类中被重写?

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

Stack Overflow用户
提问于 2008-08-20 06:50:33
回答 14查看 20.1K关注 0票数 39

有没有人知道C++中有一种语言特性或技术可以防止子类覆盖父类中的特定方法?

代码语言:javascript
复制
class Base {
public:
    bool someGuaranteedResult() { return true; }
};

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

即使它不是虚拟的,这仍然是允许的(至少在我正在使用的Metrowerks编译器中),你得到的只是一个关于隐藏非虚拟继承函数X的编译时警告。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2008-08-20 06:53:41

以下是几个想法:

  1. 将您的函数设置为私有。
  2. 不会将您的函数设置为虚拟。但是,这实际上并不能防止该函数被另一个定义所遮蔽。

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

祝好运!

票数 15
EN

Stack Overflow用户

发布于 2013-06-04 05:26:36

当您可以对虚方法(在C++11中引入)使用final说明符时,就可以做到这一点。让我引用my favorite doc site的话

当在虚函数声明中使用时,final指定函数不能被派生类重写。

适应您的示例,如下所示:

代码语言:javascript
复制
class Base {
public:
    virtual bool someGuaranteedResult() final { return true; }
};

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

编译时:

代码语言:javascript
复制
$ 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()’

当你使用微软编译器时,还要看看sealed关键字。

票数 42
EN

Stack Overflow用户

发布于 2008-08-20 07:45:10

听起来您要查找的内容等同于Java语言的final关键字prevents a method from being overridden by a subclass

因为这里的otherssuggested,所以你真的无法阻止这一点。此外,这似乎是一个相当的frequently asked question

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档