模板多态性

时间:2012-11-19 15:06:28

标签: c++ templates polymorphism

我最近通过派生类获得了very good answer as how to overload specific class members

现在的问题是其中一个成员实际上是模仿专业化的BaseClassDerivedClassDerived2Class

#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;
}

我可以毫无问题地“重载”简单的类,例如ComDerivedComDerived2Com,但BaseClass的构造函数签名将不适合类型派生类正试图发送它。

3 个答案:

答案 0 :(得分: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> 完全不同的类

答案 1 :(得分:-1)

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

答案 2 :(得分:-1)

以下an answer found elsewhere I将类Queue的概念更改为无模板。