2017-06-22 12 views
5

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

一般的に、継承されたメンバーを隠すコードでは、設計上のバグがあります(継承された仮想関数をオーバーライドするという明白な例外はあります)。 'NonFinal'でメソッドを何か呼び出すことをお勧めします。あなたがこれを行う必要があると分かった場合、OO設計に関する何かが悪いです。 – cdhowie

答えて

2

申し訳ありませんが、それは同じ名前の関数が基底クラスでfinalとして存在するとき、派生クラスで関数を作成することはできません。あなたはデザインを考え直す必要があります。

この問題は、基本クラスの関数と同じ名前の派生クラスの関数宣言が、overrideキーワードが存在するかどうかを上書きする試みとして扱われるという事実に起因しています(歴史上の理由から推定する)。したがって、上書きを「無効に」することはできません。

ここでは、関連する標準の引用です:いくつかのクラスBで仮想関数fのvirt-指定finalと中でマークされている場合

§10.3/4 [class.virtual]

クラス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 
}; 

末端

2

私は(あなたが「最後の関数をオーバーライドする」ために必要な場合、実際にあなたが何をしているかを再考する必要があるため、これは実験的な質問だと思います矛盾する音、そうじゃない?)。

しかし、「ダミー」パラメータ、つまりvoid NonFinal::print(int test=0)constを導入すると、コンパイラはメンバー関数を別のものとして扱います。それがあなたの "問題"を解決するかどうかは分かりません。少なくとも引数を渡すことなく呼び出すことができ、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..." 
} 
関連する問題