众所周知,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;
};然后,通过扩展这些抽象类中的一个或两个来实现一个新节点。
问题
我想要一个节点发送"Image“和"Text”类型的数据:然后我有一个节点: with: with:
class Node : public DataSender<Image>, DataSender<Text>嗯,我想你已经看到我的问题了,编译不允许这样做,因为如果我启动:
Node* node;
node->sendData(<my argument>);因为它无法区分应该使用哪个sendData()和父类(继承)(这是多重继承的一个常见问题)。
谢谢你的帮忙,
朱利安
发布于 2011-08-04 15:34:25
这不是很漂亮,但是您可以知道要调用哪个基类的函数
node->DataSender<Text>::sendData(<my argument>);发布于 2011-08-04 15:36:00
我不认为您有歧义问题,因为两个sendData成员函数采用不同的参数。这个问题更可能是由这样一个事实引起的:在确定要调用哪个函数时,C++按特定顺序检查基类,但在具有正确名称的成员函数的第一个基类中停止。然后,如果它找到了一个可以接受您提供的参数的参数,它就会调用它,否则它会发出您可能看到的错误。
要克服这个问题,您可以做的是在Node类定义中添加以下行:
using DataSender<Image>::sendData;
using DataSender<Text>::sendData;https://stackoverflow.com/questions/6944014
复制相似问题