如何在C ++中实现最终方法(最终在JAVA中)?

时间:2012-04-06 09:26:49

标签: c++

例如: 我在Base类中有一个实现(比如doSomething())。

我希望所有Derived类只使用此实现,而不是覆盖基类实现。

如何在C ++中强制执行此行为?

4 个答案:

答案 0 :(得分:3)

如果您只想在基类中实现它,那么不要声明它virtual,并且根本不能覆盖它。

在C ++ 11中,您可以用类似于Java的方式声明覆盖final

virtual void doSomething() final;
                           ^^^^^

在C ++ 03及更早版本中,你不能;这就是为什么它被添加到C ++ 11中。

答案 1 :(得分:2)

在C ++ 11中,将方法声明为final

在C ++ 03中,您没有内置(提供语言)功能,但您可以执行以下操作:

  • 在Base类中将方法声明为virtual
  • 不要在派生类中添加任何相同的命名方法。
  • 认真地说明目的。

#1:确保派生类不能覆盖特定方法。必须为所有对象(Base或Derived)调用相同的方法,因为无法覆盖该方法。

#2:这确保没有函数隐藏,以及隐藏Base类方法的任何可能性。

#3:这会警告您班级的用户,理由和目的。

答案 2 :(得分:2)

如果最终函数在类层次结构的基类中,则不要将其声明为虚拟。然后它无法被覆盖。

如果最终函数不在基类中(即是虚函数),则可以使用final identifier from C++11来声明函数final:

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

答案 3 :(得分:0)

请参阅我的提议如何在C ++ 03中执行此操作,但是有两个额外的要求 - 您必须在基类中预测您希望特定方法在某些派生中是最终的。而且你必须知道所有能够重新定义这种方法的类。

class A;
class B;
class C;

class A { 
public: 
  class f_final { class tag {}; friend class A; friend class B; };  // friend with classes allowed to redefine f()
  virtual void f(int a, f_final::tag = f_final::tag()) { cout << "A" << a << endl; } 
}; 

class B : public A { 
public: 
  virtual void f(int a, f_final::tag = f_final::tag()) { cout << "B" << a << endl; } 
}; 

class C : public B { 
public: 
  // won't compile 
  // virtual void f(int a, A::f_final::tag = A::f_final::tag()) { cout << "C" << a << endl; } 
}; 

int main() { 
   A* a = new C; 
   a->f(3);
   B b;
   b.f(4);
   C c;
   c.f(5); 
}