例如: 我在Base类中有一个实现(比如doSomething())。
我希望所有Derived类只使用此实现,而不是覆盖基类实现。
如何在C ++中强制执行此行为?
答案 0 :(得分:3)
如果您只想在基类中实现它,那么不要声明它virtual
,并且根本不能覆盖它。
在C ++ 11中,您可以用类似于Java的方式声明覆盖final
:
virtual void doSomething() final;
^^^^^
在C ++ 03及更早版本中,你不能;这就是为什么它被添加到C ++ 11中。
答案 1 :(得分:2)
在C ++ 11中,将方法声明为final
。
在C ++ 03中,您没有内置(提供语言)功能,但您可以执行以下操作:
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);
}