如何在C++中将方法实现为final(最终如JAVA)?
例如: 我在基类中有一个实现(比如doSomething())。如何在C++中将方法实现为final(最终如JAVA)?
我希望所有派生类只使用此实现,而不是重写基类实现。
如何在C++中强制执行此操作?
如果你只想在基类中实现它,那么不要声明它为virtual
,它根本不能被覆盖。
在C++ 11可以以类似的方式申报的覆盖final
到Java:
virtual void doSomething() final;
^^^^^
在C++ 03和更早的版本,你不能;这就是为什么它被添加到C++ 11。
在任何Derived类中或Base类方法获取* hidden *时,都不会添加任何相同的命名方法也很重要。 – 2012-04-06 09:40:51
@Als:那句话有两个谓词。 – 2012-04-06 10:07:24
@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;
};
在任何派生类或基类方法获取*隐藏*时,不要添加任何相同的命名方法也很重要。 – 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);
}
为什么你想这样做?我认为这在Java中也是一个坏习惯。 – 2012-04-06 10:03:34