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”关键字。。。