首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多重继承和模板

C++多重继承和模板
EN

Stack Overflow用户
提问于 2011-08-04 15:17:52
回答 2查看 1.8K关注 0票数 3

众所周知,C++允许多重继承。

上下文

我正在实现一个处理网络,其中一些处理节点在彼此之间进行链接,以便使用一种修改后的观察者模式交换不同的数据。

可以发送特定类型数据的节点是"DataSender“,然后扩展此抽象类。

一个节点可以接收某种类型的数据,它是一个"DataReceiver“,然后扩展这个抽象类。

,这是我的代码:

DataReceiver.h

代码语言:javascript
复制
template <typename TReceivedData>
class DataReceiver {
        public:
            void receiveData(TReceivedData* receivedData)
            {
                m_receivedData = receivedData;
            }
            TReceivedData* getReceivedData()
            {
                return(m_receivedData);
            }
        private:
            TReceivedData* m_receivedData;

DataSender.h

代码语言:javascript
复制
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:

代码语言:javascript
复制
class Node : public DataSender<Image>, DataSender<Text>

嗯,我想你已经看到我的问题了,编译不允许这样做,因为如果我启动:

代码语言:javascript
复制
Node* node;
node->sendData(<my argument>);

因为它无法区分应该使用哪个sendData()和父类(继承)(这是多重继承的一个常见问题)。

  • 1)是否有办法用sendData()来解决歧义(我不确定有一个?
  • 2),还有其他方法来解决我的沟通问题吗?(我绝对希望有机会让最终用户创建一个发送/接收数据的节点,只需扩展类似于接口的内容,数据就应该在不同的“通道”上):例如,节点可以处理文本和图像,但只能发送图像.

谢谢你的帮忙,

朱利安

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-04 15:34:25

这不是很漂亮,但是您可以知道要调用哪个基类的函数

代码语言:javascript
复制
node->DataSender<Text>::sendData(<my argument>);
票数 5
EN

Stack Overflow用户

发布于 2011-08-04 15:36:00

我不认为您有歧义问题,因为两个sendData成员函数采用不同的参数。这个问题更可能是由这样一个事实引起的:在确定要调用哪个函数时,C++按特定顺序检查基类,但在具有正确名称的成员函数的第一个基类中停止。然后,如果它找到了一个可以接受您提供的参数的参数,它就会调用它,否则它会发出您可能看到的错误。

要克服这个问题,您可以做的是在Node类定义中添加以下行:

代码语言:javascript
复制
using DataSender<Image>::sendData;
using DataSender<Text>::sendData;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6944014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档