是否可以阻止成员函数被重新定义

Is it possible to prevent a member function from being redefined?

本文关键字:新定义 定义 函数 成员 是否      更新时间:2023-10-16

我希望类B不能重新定义基类a的一个成员函数。有办法做到这一点吗?

编辑:

谢谢你的回答。我可以防止非虚拟成员函数也被覆盖吗?

如果您的意思是不允许派生类覆盖其基类的虚拟函数,C++11引入了一种使用finalvirt说明符(标准中称之为)的方法:

struct B{
  virtual void f() final;
};
struct D : B{
  void f(); // error: 'B::f' marked 'final'
};

不过,我不知道哪些编译器支持这一点。可能是GCC 4.7和Clang。

如果您的方法是virtual,那么在C++11中,您可以防止用final重写它们。

class A
{
public:
   virtual void foo() final;
};
class B : public A
{
public:
   void foo(); // <-- error
};

你无法阻止躲藏。

我可以防止非虚拟成员函数被重写为好

不,你不能,但从另一方面来说,你可以。。。如果你不在岸上,你是否会在派生类中实际覆盖基方法,你可以检查你是否覆盖了一个方法,或者是否使用了override

当把这个keywod应用到你的方法中时,你会让你真正想要的shore覆盖这个方法。

因此,如果内部方法的签名与基方法的签名相同,则会出现编译时错误,比如派生方法不覆盖基方法。

因此使用override关键字是在告诉编译器您不想遍历它。如果不使用override键wo,您永远不知道是否覆盖它

考虑以下示例:

class A
{
public:
    void f() {std::cout << "A";}
};
class B : public A
{
public:
    void f() override {std::cout << "B";}
};

这会导致编译时错误,因为您无法重写基方法。通过不使用override关键字,您当然可以覆盖它。

override keywod是在C++0x标准中引入的,并得到visual studio 2010的支持。