0

クラスを派生させて特定のクラスメンバーをオーバーロードする方法について、最近非常に良い回答を受け取りました。

現在の問題は、メンバーの 1 つが、実際にはBaseClassDerivedClassまたはDerived2Class

#include <iostream>

using std::cin;
using std::cout;
using std::endl;


template<class T>
class Queue
{
    public:
        Queue();
        Queue(T*);
}

class Com
{
    public:
        virtual void setReady()
        {
            cout << "Com" << endl;
        }
};

class DerivedCom : public Com
{
    public:
        void setReady()
        {
            cout << "DCom" << endl;
        }
};

class Derived2Com : public Com
{
    public:
        void setReady()
        {
            cout << "D2Com" << endl;
        }
};

class BaseClass
{
    protected:
        Com* com;
        Queue<BaseClass>* queue;

    public:
        BaseClass(Com* c = new Com, Queue<BaseClass>* q = new Queue<BaseClass>) : com(c), queue(q)
        {
        }

        void setReady()
        {
            com->setReady();
        }
};

class DerivedClass : public BaseClass
{
    public:
        DerivedClass() : BaseClass(new DerivedCom, new Queue<DerivedClass>) 
        {
        }
};

class Derived2Class : public BaseClass
{
    public:
        Derived2Class() : BaseClass(new Derived2Com, new Queue<Derived2Class>) 
        {}
};

int main()
{
    BaseClass* base = new Derived2Class();

    base->setReady();
    return 0;
}

のような単純なクラスを問題なく「オーバーロード」できますがCom、のコンストラクターの署名は、派生クラスが送信しようとしている型に適合しません。DerivedComDerived2ComBaseClass

4

3 に答える 3

1

代わりに、基本コンストラクターでのみ初期化Queue<BaseClass>* queue;する必要がありQueue<BaseClass*> queue;ます。Queue<std::unique_ptr<BaseClass>>

BaseClass(Com* c = new Com, Queue<BaseClass*> q = Queue<BaseClass*>()) : com(c), queue(q)
{
}

ただしBaseClass、メンバーとしてそれ自体のコレクションを保持することは、コードのにおいがします。その部分をもう一度考えてみます。

それが機能しない理由は、Queue<BaseClass>Queue<DerivedClass>完全に異なるクラスであることです。

于 2012-11-19T15:12:52.717 に答える
-1

これは、ヒープ上でBaseClassQueue<BaseClass*>* queue = new Queue<BaseClass*>();ポインター型のキューポインターを宣言し、上記のポインター表記を使用できるようにする必要がありますqueue->push(&BaseClass::setReady);...

于 2012-11-19T15:49:41.020 に答える
-1

他の場所で見つかった答えに従って、クラスの概念をQueueテンプレートなしに変更しました。

于 2012-11-20T14:08:24.357 に答える