抽象コンストラクタ
で質問させていただいた者です。
以下のようなコードで解決しようと思ったのですが、
c++
1#include <iostream> 2using namespace std; 3 4class Abstract { 5public: 6 Abstract() { initialize(); } 7 virtual void initialize() = 0; 8}; 9 10class Concrete : Abstract { 11public: 12 void initialize() override { 13 cout << "Concrete.initialize() が呼ばれた。" << endl; 14 } 15}; 16 17int main(void) { 18 Abstract obj = new Concrete(); 19}
「Abstract 抽象クラスをインスタンス化できません。」
「'初期化中' : 'Concrete*'から'Abstract'に変換できません。」
というエラーが出てしまいました。
c++を勉強し始めて1週間も経ってない本当に初心者なので、overrideキーワードの使い方や、newキーワードの使い方も微妙なのですが、何かおかしいがあれば教えてください。
#追記
main関数内で、Abstract obj;
と記述するとスタック上にAbstractのインスタンスのための領域が確保される。
子クラスは親クラスより必要とする領域が大きい場合があるため、スタック上に確保された親クラス型の変数に子クラス型の変数を入れる事は絶対不可能。
そのためポリモーフフィズムを利用したい場合は、ヒープ領域上に子クラス型のインスタンスを生成し、そのアドレスを親クラスのポインタに格納する。
newキーワードは、ヒープ領域上にインスタンスを生成し、そのインスタンスのアドレスを返させる。
deleteキーワードは、ポインタが指すインスタンスを削除し、ヒープ領域から開放する。
そのため、newやdeleteキーワードはスタック上で管理しているインスタンスには使わない。
私が今回学べたのはこんな感じですが、合ってますか?
自分がやりたかった事は実は、インスタンスの生成に必要な引数の組み合わせが複数あり、それを子クラスに明示的に強制させたかったのです。
例えば、
c++
1class Abstract { 2public: 3 virtual Abstract(int, char) = 0; 4 virtual Abstract(bool, double) = 0; 5}; 6 7class Concrete : public Abstract { 8public: 9 Concrete(int i, char c) { } // ※ 10 Concrete(bool b, double d) { } // ※ 11};
こんな様にして、※印の行を書かないとエラーを出させるという事をしたいのですが。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。