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

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被引用很多,容易造成混乱。请问各位高手,还有没有更好的办法?
...全文
147 点赞 收藏 15
写回复
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
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告