質問編集履歴
1
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -27,4 +27,31 @@
|
|
27
27
|
「'初期化中' : 'Concrete*'から'Abstract'に変換できません。」
|
28
28
|
というエラーが出てしまいました。
|
29
29
|
|
30
|
-
c++を勉強し始めて1週間も経ってない本当に初心者なので、overrideキーワードの使い方や、newキーワードの使い方も微妙なのですが、何かおかしいがあれば教えてください。
|
30
|
+
c++を勉強し始めて1週間も経ってない本当に初心者なので、overrideキーワードの使い方や、newキーワードの使い方も微妙なのですが、何かおかしいがあれば教えてください。
|
31
|
+
|
32
|
+
#追記
|
33
|
+
main関数内で、`Abstract obj;`と記述するとスタック上にAbstractのインスタンスのための領域が確保される。
|
34
|
+
子クラスは親クラスより必要とする領域が大きい場合があるため、スタック上に確保された親クラス型の変数に子クラス型の変数を入れる事は絶対不可能。
|
35
|
+
そのためポリモーフフィズムを利用したい場合は、ヒープ領域上に子クラス型のインスタンスを生成し、そのアドレスを親クラスのポインタに格納する。
|
36
|
+
newキーワードは、ヒープ領域上にインスタンスを生成し、そのインスタンスのアドレスを返させる。
|
37
|
+
deleteキーワードは、ポインタが指すインスタンスを削除し、ヒープ領域から開放する。
|
38
|
+
そのため、newやdeleteキーワードはスタック上で管理しているインスタンスには使わない。
|
39
|
+
私が今回学べたのはこんな感じですが、合ってますか?
|
40
|
+
|
41
|
+
自分がやりたかった事は実は、インスタンスの生成に必要な引数の組み合わせが複数あり、それを子クラスに明示的に強制させたかったのです。
|
42
|
+
例えば、
|
43
|
+
```c++
|
44
|
+
class Abstract {
|
45
|
+
public:
|
46
|
+
virtual Abstract(int, char) = 0;
|
47
|
+
virtual Abstract(bool, double) = 0;
|
48
|
+
};
|
49
|
+
|
50
|
+
class Concrete : public Abstract {
|
51
|
+
public:
|
52
|
+
Concrete(int i, char c) { } // ※
|
53
|
+
Concrete(bool b, double d) { } // ※
|
54
|
+
};
|
55
|
+
```
|
56
|
+
|
57
|
+
こんな様にして、※印の行を書かないとエラーを出させるという事をしたいのですが。
|