是否有可能有一个派生类继承最终函数但创建相同的函数(不覆盖)?

时间:2017-06-22 17:47:12

标签: c++ inheritance override final virtual-functions

我遇到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
};

2 个答案:

答案 0 :(得分:2)

很抱歉,但是当基类中存在与final同名的函数时,无法在派生类中创建函数。你需要重新考虑你的设计。

问题源于这样一个事实,即派生类中与基类中的函数同名的函数声明被视为尝试覆盖override关键字是否存在(对于历史记录)原因,我推测)。所以你不能“关闭”覆盖。

以下是相关的标准报价:

§10.3/ 4 [class.virtual]

  

如果某个类f中的虚拟函数B标有 virt-specifier final,并且在D派生的类BD::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 ;;但至少它引入了一个具有相同名称的函数,它仍然可以在不传递参数的情况下调用,并且与DerivedBase的函数分开。

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..."
}