众所周知,C++允许多重继承。
上下文
我正在实现一个处理网络,其中一些处理节点相互链接,以通过一种修改后的观察者模式交换不同的数据。
可以发送某种类型数据的节点是“DataSender”,然后扩展这个抽象类。
可以接收某种类型数据的节点是“DataReceiver”,然后扩展这个抽象类。
这是我的一段代码:
DataReceiver.h
template <typename TReceivedData>
class DataReceiver {
public:
void receiveData(TReceivedData* receivedData)
{
m_receivedData = receivedData;
}
TReceivedData* getReceivedData()
{
return(m_receivedData);
}
private:
TReceivedData* m_receivedData;
DataSender.h
template <typename TSentData>
class DataSender {
public:
void sendData(TSentData* sentData)
{
set<DataReceiver<TSentData>*>::const_iterator it;
for(it = m_receiverList.begin(); it != m_receiverList.end(); ++it)
(*it)->receiveData(sentData);
}
void addDataReceiver(DataReceiver<TSentData>* dataReceiver)
{
m_receiverList.insert(dataReceiver);
}
void removeDataReceiver(DataReceiver<TSentData>* dataReceiver)
{
m_receiverList.erase(dataReceiver);
}
private:
set<DataReceiver<TSentData>*> m_receiverList;
};
然后通过扩展这些抽象类中的一个或两个来简单地实现一个新节点。
问题
我想要一个发送“图像”和“文本”类型数据的节点:然后我有一个节点: 与:
class Node : public DataSender<Image>, DataSender<Text>
好吧,我想你已经看到我的问题了,编译不允许这样做,因为如果我启动的话会有歧义:
Node* node;
node->sendData(<my argument>);
因为它无法区分应该使用父类(从继承)中的哪个 sendData()(这是多重继承的常见问题)。
1) 有没有一种方法可以使用 sendData() 来解决歧义(我不确定有没有?
2) 有没有其他方法可以解决我的沟通问题? (我绝对希望有机会让最终用户想要创建一个发送/接收数据的节点,只需扩展一个接口(interface)之类的东西就可以轻松地做到这一点,并且数据应该在不同的“ channel ”上:例如一个节点可以能够处理文本和图像,但只会发送图像...
谢谢你的帮助,
朱利安
最佳答案
它不是很漂亮,但你可以告诉你打算调用哪个基类的函数
node->DataSender<Text>::sendData(<my argument>);
关于C++ 多重继承和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944014/