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

时间:2012-01-06 14:37:54

标签: c++ object polymorphism

我希望B类不能重新定义其基类A的成员函数之一。有没有办法做到这一点?

修改

感谢您的回答。我是否可以阻止非虚拟成员函数被覆盖?

3 个答案:

答案 0 :(得分:3)

如果您的意思是禁止派生类覆盖其基类的虚函数,C ++ 11引入了一种方法来使用final virt-specifier来实现(正如标准中所说):

struct B{
  virtual void f() final;
};

struct D : B{
  void f(); // error: 'B::f' marked 'final'
};
但是,我不知道哪些编译器支持这一点。可能是GCC 4.7和Clang。

答案 1 :(得分:2)

如果您的方法是virtual,则在C ++ 11中,您可以阻止使用final覆盖它们。

class A
{
public:
   virtual void foo() final;
};

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

你无法阻止隐藏。

答案 2 :(得分:0)

  

我可以阻止非虚拟成员函数被覆盖吗?   好?

不,你不能,但是从另一方面你可以......如果你没有支持,如果你在你的派生类中你是否会覆盖基本方法,你可以检查你是否覆盖了一个方法或者没有使用关键词override

将keywod应用于您的方法时,您可能会想要覆盖该方法。

所以如果inherted方法的签名与基本方法的签名相同,你将得到编译时错误,比如派生方法不会覆盖基本方法。

所以使用override关键字,告诉编译器你不想要永远。 通过不使用覆盖键你永远不知道你是否覆盖它

考虑以下示例:

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的支持。