ホームページ  >  記事  >  バックエンド開発  >  コンストラクターを仮想関数にすることはできません

コンストラクターを仮想関数にすることはできません

巴扎黑
巴扎黑オリジナル
2016-12-20 16:48:592326ブラウズ

コンストラクターを仮想関数として宣言できない理由:

1. いわゆる仮想関数は、継承の概念から、常に親クラスのオブジェクトが最初に構築され、次に親クラスのオブジェクトが構築されることを意味します。コンストラクターが仮想関数に設定されている場合、親クラスのコンストラクターを構築するときに、コンストラクターを明示的に呼び出す必要があります。もう 1 つの理由は、コンストラクターを誤ってオーバーライドした場合に発生することを防ぐためです。親クラスのコンストラクターと同じ関数を作成すると、親クラスのコンストラクターが上書きされます。つまり、親クラスの構築を完了できず、エラーが発生します。 public

class B: public A

{
public:
B( )
派生クラスのコンストラクターでは、コンパイラーは基本クラスを構築するコードを追加します。基本クラスのコンストラクターがパラメーターを使用する場合、派生クラスはそのコンストラクターで基本クラスにパラメーターを提供する必要があります。これが理由です。理由は少し複雑です。つまり、派生クラスのコンストラクターがまったく同じでなければならない場合です。親クラスとしては、これは明らかに非現実的です

もちろん、他の説明もあります: 1. ストレージ空間の観点から、仮想関数は vtable に対応しますが、この vtable は実際にはオブジェクトのメモリ空間に格納されます。問題は、コンストラクターが仮想である場合、vtable を介して呼び出す必要があるが、オブジェクトがインスタンス化されていない、つまりメモリ領域がなく、vtable が見つからない場合に発生します。そのため、コンストラクターを仮想にすることはできません。関数。

2. 使用法の観点から見ると、仮想関数は主に、情報が不完全な場合にオーバーロードされた関数を呼び出せるようにするために使用されます。コンストラクター自体はインスタンスを初期化するものなので、仮想関数を使用してもインスタンスの意味はありません。最初のインスタンスは初期化されていないのに、どのように多態性を持たせることができるのでしょうか。仮想関数の機能は、親クラスのポインターまたは参照を通じて呼び出されるときに、サブクラスを呼び出すメンバー関数になることができることです。コンストラクタはオブジェクト作成時に自動的に呼び出され、親クラスからのポインタや参照を通じて呼び出すことはできないため、仮想関数にすることはできないと規定されています。

3. 実装の観点から見ると、vtable はコンストラクターが呼び出された後に作成されるため、コンストラクターを仮想関数にすることはできません。実際の観点からは、コンストラクターの呼び出し時にオブジェクトの実際の型を決定することはできません。呼び出されます (サブクラスは親クラスのコンストラクターを呼び出す必要があります)。コンストラクターは初期化を提供し、オブジェクトの有効期間中に 1 回だけ実行されます。これはオブジェクトの動的動作ではないため、仮想関数になる必要はありません。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。