2012-06-26 47 views
3
class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 

void f(IA* p) 
{ 

} 

int main() 
{ 
    B b = B(); 
    IB* p = &b; 
    f(p); 
} 

这是在C++中用继承实现接口的正确方法吗?如果是这样,我怎么得到我的代码行f(p);编译?基本上,我想如果IB可以从IA继承,但是这会带来问题B.使用继承扩展接口

UPDATE

我要的是IB包括IA的界面,如下所示。但是,由于IA::a()A::a()彼此冲突,所以此代码不会编译。我该怎么办?

class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB : public IA 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 

更新2

这将编译,它看起来是正确的?我需要所有这些虚函数

class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: virtual public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB: virtual public IA 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: virtual public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 
+1

'IB'和'IA'没有任何相互关系。很难知道你想通过传递'IB *'来做什么,而函数期望' IA *' –

+0

为什么不直接将'&b'传递给'f'? – unkulunkulu

回答

5

好了,这当然是正确的做法,但行f(p)不应该原样编译,想象实现IB类,但没有实现IA,这是可能的,所以你不能认为他们都执行IA。如果你想假设,你可以从IA继承IB,但这是另一种设计。它可以这样实现:

class IA 
{ 
public: 
    virtual void a() = 0; 
}; 

class A: virtual public IA 
{ 
public: 
    virtual void a() 
    { 
    } 
}; 

class IB : virtual public IA 
{ 
public: 
    virtual void b() = 0; 
}; 

class B: public IB, public A 
{ 
public: 
    virtual void b() 
    { 
    } 
}; 
+0

我可以继承IB表单IA - 这正是我想要的设计。但是如果要实现IB接口并获得A的实现,那么B应该继承什么呢? – Baz

+0

@Baz,没有从'IA'帮助虚拟继承? – unkulunkulu

+0

是的!虚拟继承是我正在寻找的。始终将接口继承为虚拟是一种好的做法吗? – Baz