0

我最近收到了一个很好的答案,关于如何通过派生类来重载特定的类成员。

现在的问题是其中一个成员实际上是模板化的,其专业化要么是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

根据在别处找到的答案,我将类的概念更改Queue为无模板。

于 2012-11-20T14:08:24.357 回答
-1

你实际上应该有Queue<BaseClass*>* queue = new Queue<BaseClass*>();This 在堆上声明一个 BaseClass 指针类型的队列指针,并允许你使用上面提到的指针表示法queue->push(&BaseClass::setReady);等等......

于 2012-11-19T15:49:41.020 回答