我遇到final
函数的问题。我想"停止"类中的多态,但我仍想在派生类中生成相同的函数。
这样的事情:
class Base{
protected:
int _x, _y;
public:
Base(int x = 0, int y = 0) : _x(x), _y(y){};
int x() const { return _x; }
int y() const { return _y; }
virtual void print()const{ cout << _x*_y << endl; }
};
class Derived : public Base{
public:
Derived(int x = 0, int y = 0) : Base(x, y){}
void print()const final { cout << _x*_y / 2.0 << endl; } // final inheritance
};
class NonFinal : public Derived{
void print()const{ cout << "apparently im not the last..." << endl }
// here i want a new function. not overriding the final function from Derived class
};
答案 0 :(得分:2)
很抱歉,但是当基类中存在与final
同名的函数时,无法在派生类中创建函数。你需要重新考虑你的设计。
问题源于这样一个事实,即派生类中与基类中的函数同名的函数声明被视为尝试覆盖override
关键字是否存在(对于历史记录)原因,我推测)。所以你不能“关闭”覆盖。
以下是相关的标准报价:
§10.3/ 4 [class.virtual]
如果某个类
f
中的虚拟函数B
标有 virt-specifierfinal
,并且在D
派生的类B
中D::f
函数B::f
覆盖struct B { virtual void f() const final; }; struct D : B { void f() const; // error: D::f attempts to override final B::f };
,该程序格式错误。 [例如:
{{1}}
末端
答案 1 :(得分:2)
我认为这是一个实验性的问题,因为实际上你应该重新思考你在做什么时需要&#34;覆盖最终功能&#34; (听起来很矛盾,不是吗?)。
但你可以引入一个&#34;虚拟&#34; - 参数,即void NonFinal::print(int test=0)const
,让编译器将成员函数视为不同的成员函数。不确定这是否解决了你的问题&#34 ;;但至少它引入了一个具有相同名称的函数,它仍然可以在不传递参数的情况下调用,并且与Derived
和Base
的函数分开。
class NonFinal : public Derived{
public:
void print(int test=0)const{ cout << "apparently im not the last..." << endl; }
};
int main() {
Base b (10,10);
Derived d (20,20);
NonFinal nf;
Base *bPtr = &d;
bPtr->print(); // gives 200
bPtr = &nf; // gives 0
bPtr->print();
nf.print(); // gives "apparantly..."
}