プロが教える店舗&オフィスのセキュリティ対策術

テンプレートクラスで仮想関数を使うにはどうしたらよいですか
派生クラスのインスタンスのポインタを同じ型の親クラスのポインタに変換したいです
次の定義があり

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は何を指定すれば同じにできますか

A 回答 (3件)

何を期待しているのかよくわからないのですが, もしも


2つの XXXX に同じ型を指定して「OK」のときと同じ挙動になるようにしたい
ということであれば
それは (このままでは) できない
が答えになります.
    • good
    • 0
この回答へのお礼

回答ありがとうございます

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());

お礼日時:2019/08/10 12:10

まあそれが普通の解決策だろうね. 「テンプレートを特殊化して~」とかいう変態もないわけではないけど.



ついでに, 基底クラスのデストラクタを virtual にした方がいいかも.
    • good
    • 0
この回答へのお礼

>ついでに, 基底クラスのデストラクタを 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;
};

これを本コードにフィードバックしようと思います
ありがとうございます

お礼日時:2019/08/11 23:51

>>派生クラスのインスタンスのポインタを同じ型の親クラスのポインタに変換したいです



何をやろうとしているのか、意図がわからない。
私がC++から離れて長いからかな。
    • good
    • 0
この回答へのお礼

返信ありがとうございます

>何をやろうとしているのか、意図がわからない。

回答に関してはNo.1やNo.3で他の方からいただいているコメントの通りです

>私がC++から離れて長いからかな。

ここでの使用言語はC++ですが
内容は本質的にアーキテクチャの話なのでこれは関係ないと思います
なので、もしあなたがこの件について理解するために知見を得たい場合、
C++の方ではなく、UMLのクラス図や設計思想の方の学習をされるとよいかもしれません

お礼日時:2019/08/14 00:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!