如何继承这样的类?
有接口IAB和IB都有printb操作,IB的实现B中实现了printb,然后在IAB的实现中只实现printa,如何继承B中的printb,AB和B最后都能实例化?
class IAB
{
public:
IAB(){};
virtual ~IAB(){};
virtual void printa()=0;
virtual void printb()=0;
};
class IB
{
public:
IB(){};
virtual ~IB(){};
virtual void printb()=0;
};
class B : public IB
{
public:
B():ib(2){};
virtual ~B(){};
void printb(){printf("%d\n", ib);};
int ib;
};
class AB : public B, public IAB
{
public:
AB():ia(1){};
virtual ~AB(){};
void printa(){printf("%d\n", ia);};
//void printb(){};这个实现能不能不写
int ia;
};
int _tmain(int argc, _TCHAR* argv[])
{
AB ab;
ab.printa();
ab.printb();
B b;
b.printb();
return 0;
}
问题点数:100、回复次数:6Top
1 楼lxpws(你被耍了)回复于 2006-07-04 13:02:15 得分 20
不写恐怕不行,因为B只实现了IB中的printb,而IAB中的printb还没有被实现,可以这样:
class AB : public B, public IAB
{
public:
AB():ia(1){};
virtual ~AB(){};
void printa(){printf("%d\n", ia);};
void printb(){B::printb();};
int ia;
};
Top
2 楼sharpdew(风刃)回复于 2006-07-04 13:07:22 得分 20
如果是你那样子的类的话,就应该把接口IAB拆分为两个接口类IA和IB才比较方便。Top
3 楼al0n9(终于有四条内裤了)回复于 2006-07-04 13:33:22 得分 20
应该是不行的。实际上,AB当中有两个printb,一个是继承自IAB的printb,另一个是继承自B的printb。继承自B的printb在IB中被定义为纯虚函数,在B中已经实现。但是继承自IAB的printb仍然是一个纯虚函数,你必须实现此printb。而且在实现此printb的时候,可能需要通过域名解析指定. AB::IAB::printb()Top
4 楼rollor_phoe(柔枫)回复于 2006-07-04 14:12:35 得分 20
不写应该是不行的,因为是虚函数,采用的是动态联编,当调用 ab.printb();时,可能会找不到所需的函数而不能执行。Top
5 楼onestation(新手)回复于 2006-07-04 16:25:47 得分 0
非常感谢大家,我这样实现不知道有没有什么问题?把IAB和AB分开定义
class IA
{
public:
virtual ~IA(){};
virtual void printa()=0;
};
class IB
{
public:
virtual ~IB(){};
virtual void printb()=0;
};
class IAB : public virtual IA, public virtual IB
{
};
class A : public virtual IA
{
public:
A():ia(1){};
virtual ~A(){};
void printa(){printf("%d\n", ia);};
int ia;
};
class B : public virtual IB
{
public:
B():ib(2){};
virtual ~B(){};
void printb(){printf("%d\n", ib);};
int ib;
};
class AB : public A, public B
{
};
int _tmain(int argc, _TCHAR* argv[])
{
AB ab;
IAB * pab = reinterpret_cast<IAB*>(&ab);
pab->printa();
pab->printb();
return 0;
}Top
6 楼lyskyly(浮生三笑)回复于 2006-07-04 16:56:19 得分 20
这样应该没问题Top




