C ++では、「仮想」とは、実行時にオブジェクトの有効なクラスに依存し、変数のタイプだけに依存しないことを意味します。
「仮想」コンストラクターは、オブジェクトがまだない(オブジェクトを作成する)ため、決定に依存するクラスがないため、実際には意味がありません。
「仮想コンストラクター」では、C ++で意図されているのは、正確なクラスを知らなくてもオブジェクトを作成できるパターンである場合があります...例:
class Document {
public:
static Document *create(...);
private:
Document(...);
};
...
// Just use Document::create instead of new Document
std::unique_ptr<Document> p = Document::create(...);
この場合、クラスのユーザーはコンストラクター(プライベート)を呼び出すことはできませんが、パブリックでインスタンスへのポインターを返す静的メソッドのみを呼び出すことができます。構造自体はこの関数によって処理され、返されるオブジェクトは必ずしもDocument
インスタンスではありませんが、あなたが知らない、公開されていない、派生したクラスのインスタンスです。Document
これにより、たとえば、環境またはへの呼び出しで指定されたパラメータに応じて、実行時に正確なクラスを決定できますcreate
。
呼び出されるコンストラクターは実行時に決定されるため、これは「仮想コンストラクター」と呼ばれます。ただし、C ++での仮想ディスパッチはインスタンスのクラスにのみ依存するため、C ++での仮想メソッド呼び出しと同じではありません(ただし、前述のように、オブジェクトがまだ存在しないため、コンストラクターには意味がありません。そのため、できません。実際のクラスに応じて決定します)。