メソッドの基本的な実装を含むクラステンプレートと、特定のタイプ(double、int、char *)のテンプレートクラスを使用し、必要に応じてそれらの基本実装のサブセットをオーバーライドするサブクラスのセットが必要です。ただし、オブジェクトをサブクラスのインスタンスとして宣言しない限り、オーバーライドされたメソッドは呼び出されないようです。この問題を調査する際に、私は次のコードを思いつきました。
#include <iostream>
template <typename T>
class BaseClass {
public:
virtual void print1 (T thing) {
std::cout << "Base print1: " << thing << std::endl;
}
virtual void print2 (T thing) {
std::cout << "Base print2: " << thing << std::endl;
}
};
class IntClass : public BaseClass<int> {
public:
void print2 (int thing) {
std::cout << "Int print2: " << thing << std::endl;
}
};
int main()
{
BaseClass<int> thing = IntClass();
thing.print1(1);
thing.print2(1);
IntClass thing2 = IntClass();
thing2.print1(2);
thing2.print2(2);
return 0;
}
私の期待する出力は次のようになります。
Base print1: 1
Int print2: 1
Base print1: 2
Int print2: 2
しかし、代わりに、私は得ます:
Base print1: 1
Base print2: 1
Base print1: 2
Int print2: 2
ここで目標を達成することは可能ですか、それともこの場合、タイプごとに個別の基本クラスを作成する方がよいでしょうか?私の用語が少しずれている場合はお詫びします-私はC ++に比較的慣れていません。
のタイプthing
はBaseClass<int>
、ではありませんIntClass
。サブオブジェクトをIntClass
コピーした後、初期化に使用した一時BaseClass
オブジェクトが破棄されました。このようなオブジェクトの一部をコピーすることは、スライスと呼ばれることもあります。
ポリモーフィズムは、派生クラスのオブジェクトを参照する可能性のある基本クラスへの参照またはポインターを使用する場合に機能します。したがって、IntClass
オブジェクトへの参照を使用すると、期待される結果が得られます。
// In C++11 or later, you can bind an rvalue reference to a temporary, extending its lifetime
BaseClass<int> && thing = IntClass();
// If you're stuck in the past, you can bind an lvalue reference to a variable
IntClass ic;
BaseClass<int> & thing = ic;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加