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

问题描述:

例如: 我在基类中有一个实现(比如doSomething())。如何在C++中将方法实现为final(最终如JAVA)?

我希望所有派生类只使用此实现,而不是重写基类实现。

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

+0

为什么你想这样做?我认为这在Java中也是一个坏习惯。 – 2012-04-06 10:03:34

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

在C++ 11可以以类似的方式申报的覆盖final到Java:

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

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

+1

在任何Derived类中或Base类方法获取* hidden *时,都不会添加任何相同的命名方法也很重要。 – 2012-04-06 09:40:51

+0

@Als:那句话有两个谓词。 – 2012-04-06 10:07:24

+0

@NiklasB .:然而它是正确的。 – 2012-04-06 11:04:53

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

在C++ 03,你没有内置(语言提供)的功能,但你可以做到以下几点:

  • 声明一种方法,在基类virtual
  • 请勿在派生类中添加任何相同的命名方法。
  • 恰如其分的目的。

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

#2:这确保没有函数隐藏和隐藏基类方法的任何可能性。

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

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

如果最终的功能在基类(即是一个虚函数),你可以使用final identifier from C++11声明最后一个功能:

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

在任何派生类或基类方法获取*隐藏*时,不要添加任何相同的命名方法也很重要。 – 2012-04-06 09:41:58

见我的建议,你如何可以在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); 
}