我最近通过派生类获得了very good answer as how to overload specific class members。
现在的问题是其中一个成员实际上是模仿专业化的BaseClass
,DerivedClass
或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
,DerivedCom
和Derived2Com
,但BaseClass
的构造函数签名将不适合类型派生类正试图发送它。
答案 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
的概念更改为无模板。