テンプレートクラスで仮想関数を使うにはどうしたらよいですか
派生クラスのインスタンスのポインタを同じ型の親クラスのポインタに変換したいです
次の定義があり
template<typename T>
class Core
{
public:
Core::Core() {}
Core::~Core() {}
virtual int get() const = 0;
};
class Alice : public Core<int>
{
public:
Alice::Alice() {}
Alice::~Alice() {}
virtual int get() const { return 42; }
};
class Bob : public Core<double>
{
public:
Bob::Bob() {}
Bob::~Bob() {}
virtual int get() const { return 43; }
};
以下のように使用する場合
Alice a;
Bob b;
// OK
Core<int>* p = &a;
Core<double>* q = &b;
// ?
// XXXX* p = &a;
// XXXX* q = &b;
// ?のXXXXは何を指定すれば同じにできますか
No.1ベストアンサー
- 回答日時:
何を期待しているのかよくわからないのですが, もしも
2つの XXXX に同じ型を指定して「OK」のときと同じ挙動になるようにしたい
ということであれば
それは (このままでは) できない
が答えになります.
回答ありがとうございます
Coreを変更し以下にしました
class IC
{
public:
virtual int get() const = 0;
};
template<typename T>
class Core : public virtual IC
{
public:
Core() {}
~Core() {}
virtual int get() const = 0;
};
以下のようにできるようになりました
IC* r;
r = &a; // OK
printf("%d\n", r->get());
r = &b; // OK
printf("%d\n", r->get());
No.3
- 回答日時:
まあそれが普通の解決策だろうね. 「テンプレートを特殊化して~」とかいう変態もないわけではないけど.
ついでに, 基底クラスのデストラクタを virtual にした方がいいかも.
>ついでに, 基底クラスのデストラクタを virtual にした方がいいかも.
以下のようになりました
class IC
{
public:
virtual ~IC() = 0 {};
virtual int get() const = 0;
};
template<typename T>
class Core : public virtual IC
{
public:
Core() {}
virtual ~Core() {}
virtual int get() const = 0;
};
これを本コードにフィードバックしようと思います
ありがとうございます
No.2
- 回答日時:
>>派生クラスのインスタンスのポインタを同じ型の親クラスのポインタに変換したいです
何をやろうとしているのか、意図がわからない。
私がC++から離れて長いからかな。
返信ありがとうございます
>何をやろうとしているのか、意図がわからない。
回答に関してはNo.1やNo.3で他の方からいただいているコメントの通りです
>私がC++から離れて長いからかな。
ここでの使用言語はC++ですが
内容は本質的にアーキテクチャの話なのでこれは関係ないと思います
なので、もしあなたがこの件について理解するために知見を得たい場合、
C++の方ではなく、UMLのクラス図や設計思想の方の学習をされるとよいかもしれません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
C++でfriendクラスにしているの...
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
継承したクラス側のクラス名の取得
-
C# log4netの使い方
-
C#にて別クラスの関数を使いたい
-
構造 他のクラスの構造体を別...
-
visual studioのデザイナ画面で...
-
a href="..." とServlet
-
アップキャスト、ダウンキャス...
-
親クラスから子クラスへアクセス。
-
C#のクラスライブラリでメッセ...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
オブジェクト指向プログラミン...
-
生成したインスタンスを削除す...
-
変数名の付け方
-
servletからjspへオブジェクト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
SwingでgetContentPaneのエラー...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報