继承抽象的基础接口及其实现给出了C2259

Inheriting both abstract base interface and its implementation gives C2259

本文关键字:实现 C2259 抽象的 接口 继承      更新时间:2023-10-16

我有以下条件:

带有的赤裸基类>许多纯虚拟函数:

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;
};

i创建实现所有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

您应该使用以下代码:

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类继承的两个地方都应标记为虚拟。

我认为您应该指定两个继承之一是虚拟的。

那是

的钻石继承

ibase是顶级

ibaseext_a和cbase是中间级

cbaseext_a是底层

因此,在cbaseext_a中,您要指定从哪个路径实现最高级别,我可能会说,您可能要在ibaseext_a中指定cbase sashitance是公共虚拟的,而不是公开。

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