基本クラスメソッドが派生クラスによってオーバーライドされないようにするにはどうすればよいですか?メソッドが派生クラスでオーバーライドされないようにするにはどうすればよいですか?
答えて
メソッドを非仮想にすると、派生クラスはメソッドをオーバーライドできません。ただし、クラスは基本クラスのメソッドをオーバーライドできません。または、の派生クラスが同じメソッドをオーバーライドするのを防ぎます。メソッドが仮想になると、それは仮想のままです。
+1:しかし、私のために重要な部分でした。 – imallett
with C++ 11 final
指定子を使用すると、派生クラスでメソッドがオーバーライドされないようにすることができます。 –
tharinduwijewardane
もしそれを公開しておきたいのであれば、それを仮想的に宣言してはいけません。
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;
}`
派生クラスは、依然として仮想プライベートメンバー関数をオーバーライドできます。 –
訂正のために、私は編集しました。 –
私は友人を誘導したり、アクセス指定子を減らしたりせずにプライベートメソッドをオーバーライドできます – sriks
仮想化しないでください。
これはあなたのクラスから派生し、(同じ名前の別のメンバ関数を提供することによって)関数を隠すことを妨げません。しかし、あなたのクラスがとにかく派生することを意図していない場合(仮想デストラクタも仮想メンバ関数もない)、それは問題ではありません。
私があなたがC++でそれを行うことができないと知っている限り、あなたはそれを私的として宣言しようとすることができます。 。このリンクの詳細情報を見つけるhttp://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm
派生クラスは仮想プライベートメンバー関数をオーバーライドできます。 –
短い答え:それは必要ありません。あなたは長い答えをsome twistsできますが、それだけの価値はありますか?
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()’
- 1. 他の派生クラスから派生クラスのメンバーにアクセスするにはどうすればよいですか?
- 2. 別の派生クラスから他の派生クラスにアクセスするにはどうすればよいですか?
- 3. Kotlin派生クラスでオーバーライドするJavaオーバーロードを選択するにはどうすればよいですか?
- 4. 派生クラスのメソッドが呼び出されるようにするにはどうすればよいですか?
- 5. 他のSystemCクラスからSystemCクラスを派生させるにはどうすればよいですか?
- 6. メソッドがトリガーされないようにするにはどうすればよいですか?
- 7. TypeScript、Angular2の派生クラスで基本クラスのコンストラクタパラメータを繰り返さないようにするにはどうすればよいですか?
- 8. どのようにすべての派生クラスでオーバーライドされたメソッドを呼び出すため
- 9. 生成されたターゲットからBUILDファイルを派生させるにはどうすればよいですか?
- 10. 検証属性が生成されないようにするにはどうすればよいですか?
- 11. Rplots.pdfが生成されないようにするにはどうすればよいですか?
- 12. EditorTemplateロジックがViewロジックをオーバーライドできないようにするにはどうすればよいですか?
- 13. PHPクラスのコンストラクタをオーバーライドするにはどうすればよいですか?
- 14. Spring AOP - 派生クラスがターゲットにされないようにする方法
- 15. 基本クラスから派生し、C#でインターフェイスを実装するにはどうすればよいですか?
- 16. select2.jsがカスタム変更をオーバーライドしないようにするにはどうすればよいですか?
- 17. プロジェクト内の既存のクラスのリストを派生させるにはどうすればよいですか?
- 18. メソッドをクラスに変換するにはどうすればよいですか?
- 19. 派生クラスで基本テンプレートクラス関数を表示するにはどうすればよいですか?
- 20. 派生クラスが作成プロパティによって暗黙的に指定されているオブジェクトを作成するにはどうすればよいですか?
- 21. 抽象クラス内にネストされたクラスのメソッドにアクセスするにはどうすればよいですか?
- 22. 2倍の派生クラスTCollectionItemをTOwnedCollectionに追加するにはどうすればよいですか?
- 23. インスタンスを派生クラスにキャストするにはどうすればよいですか?
- 24. カスタムキーバインドがノイズを発生させないようにするにはどうすればよいですか?
- 25. オーバーライドされたメソッドleave()でStringEditの値を変更するにはどうすればよいですか?
- 26. クラスはどのようにセットアップすればよいですか?
- 27. Windowsでは、レジストリエントリが変更されないようにするにはどうすればよいですか?
- 28. TCustomPanelから派生したコンポーネントにコントロールが追加されないようにするにはどうすればいいですか?
- 29. iframeでfocus()が実行されないようにするにはどうすればよいですか?
- 30. サーブレットでフォーム入力がクリアされないようにするにはどうすればよいですか?
しないでくださいそれは基本クラスで仮想ですか?その後、オーバーライドすることはできません。オーバーロードするだけです。もしそれが問題であれば、Javaの 'final'メソッドと直接同等のものはありません。 –
仮想キーワードを使用しないので、Javaでどのように実装したのですか?Javaで – sriks
を実装しました。メソッドfinalを指定すると、サブクラスはそのメソッドを実装できなくなり、コンパイラやバイトコードベリファイアで。 C++では、禁止する方法はありません。オーバーライドの定義によって、仮想関数だけを「オーバーライド」することができます。 –