继承抽象的基础接口及其实现给出了C2259
Inheriting both abstract base interface and its implementation gives C2259
我有以下条件:
带有的赤裸基类>许多纯虚拟函数:
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... */}
};
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何知道C2259 VS 2017错误未实现哪种方法?
- 继承抽象的基础接口及其实现给出了C2259
- 实现IUnknown接口时出现错误c2259:无法实例化抽象类
- 错误c2259从IUnknown实现接口类