ポリモーフィズムとC ++のクラステンプレートからのメソッドのオーバーライド

ダイアゴナルフィッシュ

メソッドの基本的な実装を含むクラステンプレートと、特定のタイプ(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 ++に比較的慣れていません。

マイクシーモア

のタイプthingBaseClass<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]

編集
0

コメントを追加

0

関連記事

分類Dev

ポリモーフィズムによるC ++テンプレートメソッドのオーバーロードとクラスアクセス

分類Dev

ObjectiveCのポーズとポリモーフィズム/メソッドのオーバーライド

分類Dev

JSポリモーフィズムとメソッドのオーバーライドを使用する

分類Dev

ゲームデザインでのポリモーフィズム、キャスティング、メソッドオーバーライドのJava実装

分類Dev

Objectivecのスーパークラスからプライベートメソッドとプロパティをオーバーライドする方法

分類Dev

Sonのオーバーライドメソッドは、C ++のFatherテンプレートクラスのオーバーライドメソッドを呼び出すことができますか?

分類Dev

派生クラスのテンプレートベースメソッドをオーバーライドしますか?

分類Dev

クラスメソッドとテンプレートのオーバーロード

分類Dev

別のテンプレートクラスと名前空間からのc ++メソッドのリーク

分類Dev

c ++-メモリリークとポリモーフィズム

分類Dev

派生クラスのテンプレートクラスの静的メソッドをオーバーライドする方法

分類Dev

インターフェイスのシミュレーション、メソッドのオーバーライド、ポリモーフィズム、およびCでオーバーライドされたスーパーメソッドの呼び出し

分類Dev

スーパークラスコンストラクターからの基本クラスオーバーライドメソッドの呼び出し

分類Dev

フレンドサブクラスのベースからプライベートメソッドを使用する-NVCCのコンパイラバグ?

分類Dev

C#ポリモーフィズムとメソッドの継承

分類Dev

テンプレート基本クラスからの純粋仮想関数のオーバーライド

分類Dev

任意のメソッドのオーバーロードは、コンパイル時のポリモーフィズムことですか?

分類Dev

クラステンプレートのテンプレートメソッドオーバーロード解決ルール

分類Dev

ランタイムポリモーフィズムでのJavaメソッドアクセス

分類Dev

ポリモーフィズムのグッドプラクティス

分類Dev

異なるクラスローダー間でデフォルトのアクセサーメソッドをオーバーライドすると、ポリモーフィズムが壊れます

分類Dev

C ++のポリモーフィズム

分類Dev

ポリモーフィズムとメソッドのオーバーロード

分類Dev

ポリモーフィズムを実装しようとしていますが、エラー:メソッドはスーパータイプのメソッドをオーバーライドまたは実装していません

分類Dev

テンプレートクラスのCythonC ++静的メソッド

分類Dev

クラス内のテンプレートメソッド

分類Dev

基本クラスからの非同期voidイベントハンドラーメソッドのオーバーライド

分類Dev

C ++のポリモーフィズム:オーバーライドされたメソッドの呼び出し

分類Dev

派生テンプレートクラスの基本クラスからメソッドを特殊化します

Related 関連記事

  1. 1

    ポリモーフィズムによるC ++テンプレートメソッドのオーバーロードとクラスアクセス

  2. 2

    ObjectiveCのポーズとポリモーフィズム/メソッドのオーバーライド

  3. 3

    JSポリモーフィズムとメソッドのオーバーライドを使用する

  4. 4

    ゲームデザインでのポリモーフィズム、キャスティング、メソッドオーバーライドのJava実装

  5. 5

    Objectivecのスーパークラスからプライベートメソッドとプロパティをオーバーライドする方法

  6. 6

    Sonのオーバーライドメソッドは、C ++のFatherテンプレートクラスのオーバーライドメソッドを呼び出すことができますか?

  7. 7

    派生クラスのテンプレートベースメソッドをオーバーライドしますか?

  8. 8

    クラスメソッドとテンプレートのオーバーロード

  9. 9

    別のテンプレートクラスと名前空間からのc ++メソッドのリーク

  10. 10

    c ++-メモリリークとポリモーフィズム

  11. 11

    派生クラスのテンプレートクラスの静的メソッドをオーバーライドする方法

  12. 12

    インターフェイスのシミュレーション、メソッドのオーバーライド、ポリモーフィズム、およびCでオーバーライドされたスーパーメソッドの呼び出し

  13. 13

    スーパークラスコンストラクターからの基本クラスオーバーライドメソッドの呼び出し

  14. 14

    フレンドサブクラスのベースからプライベートメソッドを使用する-NVCCのコンパイラバグ?

  15. 15

    C#ポリモーフィズムとメソッドの継承

  16. 16

    テンプレート基本クラスからの純粋仮想関数のオーバーライド

  17. 17

    任意のメソッドのオーバーロードは、コンパイル時のポリモーフィズムことですか?

  18. 18

    クラステンプレートのテンプレートメソッドオーバーロード解決ルール

  19. 19

    ランタイムポリモーフィズムでのJavaメソッドアクセス

  20. 20

    ポリモーフィズムのグッドプラクティス

  21. 21

    異なるクラスローダー間でデフォルトのアクセサーメソッドをオーバーライドすると、ポリモーフィズムが壊れます

  22. 22

    C ++のポリモーフィズム

  23. 23

    ポリモーフィズムとメソッドのオーバーロード

  24. 24

    ポリモーフィズムを実装しようとしていますが、エラー:メソッドはスーパータイプのメソッドをオーバーライドまたは実装していません

  25. 25

    テンプレートクラスのCythonC ++静的メソッド

  26. 26

    クラス内のテンプレートメソッド

  27. 27

    基本クラスからの非同期voidイベントハンドラーメソッドのオーバーライド

  28. 28

    C ++のポリモーフィズム:オーバーライドされたメソッドの呼び出し

  29. 29

    派生テンプレートクラスの基本クラスからメソッドを特殊化します

ホットタグ

アーカイブ