2017-02-23 26 views
2

我有以下条件:继承这两个抽象基接口和它的实现提供C2259

的absract基类许多纯虚函数:

interface IBase 
{ 
    virtual void foo1() = 0; 
    virtual void foo2() = 0; 
    virtual void foo3() = 0; 
    virtual void foo4() = 0; 
    virtual void foo5() = 0; 
    // ... 
    virtual void fooN() = 0; 
}; 

两个小接口继承它:
版-A:

interface IBaseExt_A : 
    public IBase 
{ 
    virtual void foo_A() = 0; 
}; 

版-B:

interface IBaseExt_B : 
    public IBase 
{ 
    virtual void foo_B() = 0; 
}; 

我创建一个实现所有的IBase接口函数的基类:

class CBase : 
    public IBase 
{ 
public: 
    virtual void foo1() { /* Do something... */} 
    virtual void foo2() { /* Do something... */} 
    virtual void foo3() { /* Do something... */} 
    virtual void foo4() { /* Do something... */} 
    virtual void foo5() { /* Do something... */} 
    // ... 
    virtual void fooN() { /* Do something... */} 
}; 

现在,我要实现这两个衍生版本,最少的代码
我希望做一些事情,如:

class CBaseExt_A : 
    public IBaseExt_A, 
    public CBase 
{ 
public: 
    virtual void foo_A() { /* Do something... */} 
}; 

显然,这给了错误:
C2259: 'CBaseExt_A': cannot instantiate abstract class...
这些错误指的是所有IBase接口功能。

我知道我可以通过委派所有IBase功能CBase执行很长的路要走解决它:

class CBaseExt_A : 
    public IBaseExt_A, 
    public CBase 
{ 
// IBase implementation: 
public: 
    virtual void foo1() { CBase::foo1();} 
    virtual void foo2() { CBase::foo2();} 
    virtual void foo3() { CBase::foo3();} 
    virtual void foo4() { CBase::foo4();} 
    virtual void foo5() { CBase::foo5();} 
    // ... 
    virtual void fooN() { CBase::fooN();} 

// IBaseExt_A implementation: 
public: 
    virtual void foo_A() { /* At last - do what we came here for...*} 
}; 

但是这让我小班CBaseExt_A变得大而复杂。
有没有办法如何避免所有这些手动委派编码?

非常感谢,PAZO

+1

虚拟继承可能会有所帮助。 – Jarod42

+1

C++中的接口关键字?你使用什么编译器? –

+0

@KirillKobelev - 我添加了:#define interface struct – PazO

回答

1

你应该使用下面的代码:

interface IBase 
{ 
    virtual void foo() = 0; 
    ...... 
}; 

class CBase : virtual public IBase 
{ 
    void foo() { } 
    ...... 
}; 

interface IBaseExt_A : virtual public IBase 
{ 
    virtual void foo_A() = 0; 
}; 

struct CBaseExt_A : public IBaseExt_A, public CBase 
{ 
    virtual void foo_A() { /* Do something... */ } 
}; 

注意的是,当IBase类是继承了这两个地方应该被标记为虚拟的。

+0

谢谢!这工作 – PazO

0

我想你应该指定两个遗产之一是虚拟的。

这是一个菱形继承其中

IBASE是顶级

IBaseExt_A和CBase的是中等水平

CBaseExt_A是底层

所以CBaseExt_A要指定从哪条路径实现最高级别,我想说您可能想要指定IBaseExt_A中的CBase继承为公共虚拟而不是公共。

class CBaseExt_A : 
public IBaseExt_A, 
public virtual CBase 
{ 
public: 
    virtual void foo_A() { /* Do something... */} 
}; 
+0

我发现我需要在'IBase'被继承的所有地方添加'虚拟'关键字... – PazO

相关问题