2010-12-16 18 views
10

基本クラスメソッドが派生クラスによってオーバーライドされないようにするにはどうすればよいですか?メソッドが派生クラスでオーバーライドされないようにするにはどうすればよいですか?

+5

しないでくださいそれは基本クラスで仮想ですか?その後、オーバーライドすることはできません。オーバーロードするだけです。もしそれが問題であれば、Javaの 'final'メソッドと直接同等のものはありません。 –

+0

仮想キーワードを使用しないので、Javaでどのように実装したのですか?Javaで – sriks

+0

を実装しました。メソッドfinalを指定すると、サブクラスはそのメソッドを実装できなくなり、コンパイラやバイトコードベリファイアで。 C++では、禁止する方法はありません。オーバーライドの定義によって、仮想関数だけを「オーバーライド」することができます。 –

答えて

14

メソッドを非仮想にすると、派生クラスはメソッドをオーバーライドできません。ただし、クラスは基本クラスのメソッドをオーバーライドできません。または、の派生クラスが同じメソッドをオーバーライドするのを防ぎます。メソッドが仮想になると、それは仮想のままです。

+1

+1:しかし、私のために重要な部分でした。 – imallett

+4

with C++ 11 final指定子を使用すると、派生クラスでメソッドがオーバーライドされないようにすることができます。 – tharinduwijewardane

1

もしそれを公開しておきたいのであれば、それを仮想的に宣言してはいけません。

EDIT:Srikanthは、派生クラスのプライベートメンバー関数のオーバーライドについて不思議に思っています。

class A 
{ 
public: 
    virtual ~A(){}; 
    void test() 
    { 
     foo(); 
    }; 
private: 
    virtual void foo() 
    { 
     std::cout << "A"; 
    }; 
}; 


class B : public A 
{ 
public: 
    virtual void foo() 
    { 
     std::cout << "B"; 
    }; 
}; 


void test() 
{ 
    B b; 
    A& a = b; 

    a.test(); // this calls the derived B::foo() 

    return 0; 
}` 
+3

派生クラスは、依然として仮想プライベートメンバー関数をオーバーライドできます。 –

+0

訂正のために、私は編集しました。 –

+0

私は友人を誘導したり、アクセス指定子を減らしたりせずにプライベートメソッドをオーバーライドできます – sriks

2

仮想化しないでください。

これはあなたのクラスから派生し、(同じ名前の別のメンバ関数を提供することによって)関数を隠すことを妨げません。しかし、あなたのクラスがとにかく派生することを意図していない場合(仮想デストラクタも仮想メンバ関数もない)、それは問題ではありません。

0

私があなたがC++でそれを行うことができないと知っている限り、あなたはそれを私的として宣言しようとすることができます。 。このリンクの詳細情報を見つけるhttp://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm

+0

派生クラスは仮想プライベートメンバー関数をオーバーライドできます。 –

-1

短い答え:それは必要ありません。あなたは長い答えをsome twistsできますが、それだけの価値はありますか?

18

final指定子をC++ 11から使用できる場合は、派生クラスがそのメソッドをオーバーライドできないようにすることができます。 (マイクロソフトのコンパイラは、同じような意味で似たsealedをサポートするために表示されます)

ここでは例です:

#include <iostream> 

struct base { 
    // To derived class' developers: Thou shalt not override this method 
    virtual void work() final { 
     pre_work(); 
     do_work(); 
     post_work(); 
    } 
    virtual void pre_work() {}; 
    virtual void do_work() = 0; 
    virtual void post_work() {}; 
}; 

struct derived : public base { 
    // this should trigger an error: 
    void work() { 
     std::cout << "doing derived work\n"; 
    } 
    void do_work() { 
     std::cout << "doing something really very important\n"; 
    } 
}; 

int main() { 
    derived d; 
    d.work(); 
    base& b = d; 
    b.work(); 
} 

は、ここで私はそれをコンパイルしようとしたとき、私は何を得るのです。

$ g++ test.cc -std=c++11 
test.cc:17:14: error: virtual function ‘virtual void derived::work()’ 
test.cc:5:22: error: overriding final function ‘virtual void base::work()’ 
+0

質問:派生クラスでオーバーライドしたくない場合、なぜ "仮想"と宣言しなければならないのですか? – Sonic78

+0

@ Sonic78良い質問!実世界のコードでは、中間ベースから派生したクラスでオーバーライドしたくない仮想関数を提供する、 'base'の別の基本クラスを持つことができます。 – moooeeeep

関連する問題