2017-12-24 9 views
0

私は(要約)のように、戻り引数として純粋ADTを使用したいと思います。その後、純抽象データ型をリターンとして使用するか?

class PADT { 
public: 
    virtual ADT func() = 0; 
    virtual int iFun() = 0; 
} 

class X : PADT { 
public: 
    virtual PADT func() { return X(); } 
    virtual int iFun() { return 1; } 
} 

Class Y : PADT { 
public: 
    virtual PADT func() { return Y(); } 
    virtual int iFun() { return 2; } 
} 

そして、どのように私はそれを使うだろうか?

+0

C++は、このように動作しません。おそらく 'std :: shared_ptr'と動的スコープのオブジェクトを使う必要があります。 –

+1

値で仮想タイプを返すことはできませんが、仮想メソッドが機能することは期待できます。クラスが抽象クラスであるという事実は、基本クラスに "合理的な"デフォルト実装がないので、 'X'または' Y'の割り当てられたインスタンスへのポインタを返すことができます。 PADT * 'おそらく' std :: shared_ptr'や 'std :: unique_ptr'を使い、寿命管理を簡素化したいでしょう。 –

答えて

3

C++の値には修正タイプがあります。 C++の組み込みOOランタイム多態性を(直接的に)使用することはできません。

ランタイム値多型は、std関数などのC++で実装できますが、(直接的に)C++オブジェクト指向システムを使用することはできません。 Std関数のoperator()、copy、move、およびdestroy操作はすべて実行時に多相で実行されます。それらのどれもvirtualではありません。

多態性が必要な場合は、std関数の実装方法を見てください。 C++組み込みの仮想メソッドを使いたい場合は、スマートポインタを返す方法を理解し、それらを使って作業してください。

0

多型は、あなたがポインタまたは参照と仕事をしなければならないC++で作業するためには。

スマートポインタを使用して、std::unique_ptrのような動的オブジェクトを管理するのが一般的です。これは、ポインタが範囲外になったときにオブジェクトを自動的に削除するので、忘れてはいけません。このような

何か:

class PADT { 
public: 
    // return a pointer (pref a unique_ptr) 
    virtual std::unique_ptr<PADT> func() = 0; 
    virtual int iFun() = 0; 
}; 

class X : public PADT { 
public: 
    virtual std::unique_ptr<PADT> func() { return std::make_unique<X>(); } 
    virtual int iFun() { return 1; } 
}; 

class Y : public PADT { 
public: 
    virtual std::unique_ptr<PADT> func() { return std::make_unique<Y>(); } 
    virtual int iFun() { return 2; } 
}; 

int main() 
{ 
    X x; // an x 
    Y y; // a y 

    std::unique_ptr<PADT> padt = x.func(); 

    std::cout << "x: " << padt->iFun() << '\n'; 

    padt = y.func(); 

    std::cout << "y: " << padt->iFun() << '\n'; 
} 

が出力:

x: 1 
y: 2 
関連する問題