Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承抽象基接口及其实现后得到C2259_C++_Inheritance_Abstract Class - Fatal编程技术网

C++ 继承抽象基接口及其实现后得到C2259

C++ 继承抽象基接口及其实现后得到C2259,c++,inheritance,abstract-class,C++,Inheritance,Abstract Class,我有以下情况: 具有多个纯虚函数的抽象基类: 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; }; class CBase : p

我有以下情况:

具有多个纯虚函数的抽象基类:

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;
};
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... */}
};
继承它的两个小接口:
A版:

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

interface IBaseExt_B :
    public IBase
{
    virtual void foo_B() = 0;
};
我创建了实现所有
IBase
接口函数的基类:

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;
};
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':无法实例化抽象类…

这些错误涉及所有
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...*}
};
但这使我的小班变得庞大而复杂。
有没有办法避免所有这些手动委托编码?


非常感谢,PazO

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

那是钻石遗产

IBase是最高级的

IBaseExt_A和CBase为中级

CBASEXT_A是最底层

因此,在cbasext_A中,您希望指定从哪个路径实现顶层,我想说的是,您可能希望在IBaseExt_A中指定CBase继承为public virtual,而不仅仅是public

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

您应该使用以下代码:

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>代码>类的两个地方都应该标记为Virtual.

虚拟继承可能有帮助。C++中的接口关键字?你在使用什么编译器?@KirillKobelev-我补充道:#定义接口结构我发现我需要在所有继承“IBase”的地方添加“virtual”关键字。。。