关于多基类派生的歧义性问题

mountlin 2005-01-23 02:16:59
如下:
class B1
{
DWORD m_dwRef;
...
};

class B2
{
DWORD m_dwRef;
...
};

template < class T >
class DT : public T
{
DT()
{
m_dwRef = 1;
}
}

class D : public B1, public B2
{
...
}

DT< D > d;

这样因为m_dwRef的歧义无法编译通过。在DT::DT()中使用的m_dwRef应该是B1::m_dwRef,但是由于B1、B2、DT都是某些库的函数,不能修改,那么怎样解决这个问题?
我现在是用重新定义DT(把库里的整个定义和实现全部复制到我的程序里,再把m_dwRef改成B1::m_dwRef),但显然这方法太笨了。#define m_dwRef B1::m_dwRef我也想过,但由于DT和m_dwRef被引用很多,容易造成混乱。请问各位高手,还有没有更好的办法?
...全文
255 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
idau7 2005-01-28
  • 打赏
  • 举报
回复
类继承结构更改比较麻烦的.

so,建议还是用成员类型吧.
021850524 2005-01-28
  • 打赏
  • 举报
回复
建议把重复的做在class B中然后B1和B2再virtual public B,然后D再多重继承B1和B2;

class B
{
DWORD m_dwRef;
...
};

class B1:virtual public B {...};
class B2:virtual public B {...};

class D : public B1, public B2 {...};
dongpy 2005-01-27
  • 打赏
  • 举报
回复
mark
autoegg 2005-01-24
  • 打赏
  • 举报
回复
方法无非就是两个:
一是指定成员类型;二是改变类继承结构。
Henry0 2005-01-24
  • 打赏
  • 举报
回复
建议楼主不用继承用组合,把T作为成员

template < class T >
class DT
{
public:
T t;
DT()
{
t.B1::m_dwRef = 1;
}
}
somedummy 2005-01-23
  • 打赏
  • 举报
回复
还有个办法,就是在你的派生类里面创建引用,并且和基类的那两个东西同名,然后再构造函数里面初始化,这样可以用派生类的对象遮蔽基类对象,这样的话名字冲突就解决了,只不过这样的话只能引用一个对象罢了
xiaolizi 2005-01-23
  • 打赏
  • 举报
回复
在你的类中声明两个DWORD* ref_m_dwR,然后分别指向基类的m_dwR,然后操作的时候直接操作指针算了。
somedummy 2005-01-23
  • 打赏
  • 举报
回复
虚拟继承不能解决这样的问题吧?虚拟继承主要解决的是多继承下的成员重复,而不是多继承下的名字冲突。

似乎没有什么好的解决方法,不过可以引入中间代理,然后用中间的代理来控制成员,中间代理实现的是组合而不是继承,这样就可以解决名字的冲突了。
sunwt 2005-01-23
  • 打赏
  • 举报
回复

#define DWORD double
class B1
{
public:
DWORD m_dwRef;
};

class B2
{
public:
DWORD m_dwRef;
};

template < class T >
class DT : public T
{
public:
DT()
{
m_dwRef = 1;
}
};

class D : public B1, public B2
{
public:
B1::m_dwRef;
};

template <>
class DT<D> : public D
{
public:
DT()
{
B1::m_dwRef = 1;
}
};

int main()
{
DT< D > d;
return 0;
}
sunwt 2005-01-23
  • 打赏
  • 举报
回复
特化一下即可
template <>
class DT<D> : public D
{
public:
DT()
{
B1::m_dwRef = 1;
}
};

g++调试通过
pengzhenwanli 2005-01-23
  • 打赏
  • 举报
回复
class D : public B1, public B2
{
B1::m_dwRef;
...
}
名字曝光一下的。
bianliuwei 2005-01-23
  • 打赏
  • 举报
回复
不用继承,而把T作为DT的成员是否可以呢?
playmud 2005-01-23
  • 打赏
  • 举报
回复
template < class T >
class DT : public T
{
public:
int m_dwRef;
DT()
{
m_dwRef = 1;
}
};
增加自己的一个m_dwRef,因为你不知道这个T里面是否有这个变量。
为了不因起二义性就要明确的指定,如果D是从三个类里面继承过来的那?
具体怎么作还是要和你的实际需要结合起来的。
useresu 2005-01-23
  • 打赏
  • 举报
回复
虚基类,即使用虚拟继承。
class D : virtual public B1, virtual public B2
{
...
}

idler 2005-01-23
  • 打赏
  • 举报
回复
mark&up

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧