多重继承和模板
C++ Multiple inheritance and templates
本文关键字:多重继承 更新时间:2023-10-16
众所周知,c++允许多重继承。
<<p> 上下文/strong>我正在实现一个处理网络,其中一些处理节点相互连接,以一种修改的观察者模式交换不同的数据。
可以发送特定类型数据的节点是"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;
};
则通过扩展其中一个或两个抽象类来实现新节点。
我想要一个节点发送类型为"图像"answers"文本"的数据:然后我有一个节点::
class Node : public DataSender<Image>, DataSender<Text>
嗯,我想你已经看到了我的问题,编译不允许这样做,因为如果我启动:
Node* node;
node->sendData(<my argument>);
,因为它无法从父类(从继承)中区分应该使用哪个sendData()(这是多重继承的一个常见问题)。
1)是否有办法使用sendData()与一些东西来解决歧义(我不确定是否有一个?
是否有其他方法可以解决我的沟通问题?(我绝对希望有机会,最终用户想要创建一个发送/接收数据的节点,可以简单地通过扩展像接口这样的东西来轻松地做到这一点,数据应该在不同的"通道"上:例如,一个节点可以处理文本和图像,但只会发送图像…
谢谢你的帮助,
朱利安,这并不漂亮,但您可以告诉您打算调用哪个基类的函数
node->DataSender<Text>::sendData(<my argument>);
我不认为您有歧义问题,因为两个sendData成员函数采用不同的参数。这个问题更可能是由以下事实引起的:在确定调用哪个函数时,c++按特定顺序检查基类,但在第一个具有正确名称的成员函数的基类中停止。然后,如果它找到了一个可以接受你提供的参数的函数,它就调用它,否则它会发出你可能看到的错误。
要克服这个问题,您可以在Node
类定义中添加以下行:
using DataSender<Image>::sendData;
using DataSender<Text>::sendData;
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 使用多重继承时出现编译错误
- 增强多重继承的序列化
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- C++多重继承和鸭子类型
- C++两次从文件保存对象读取多重继承
- 从多重继承中的派生类函数调用适当的父类函数
- C++具有多重继承的构造函数重载解析