gpt4 book ai didi

c++ - 虚拟多接口(interface)

转载 作者:行者123 更新时间:2023-11-30 01:47:47 24 4
gpt4 key购买 nike

我需要有关使用接口(interface)的多重继承的实现的帮助...

有一个现有的代码和一个具有很多功能的接口(interface)。这些实例是使用工厂创建的。

class IBig
{
// Lot of pure virtual functions
};
And his inplementation:

class CBig: public IBig
{
// Implementation
}

我想将界面拆分为多个较小的界面,但它应该在一段时间内与现有代码保持兼容。

这是我尝试做的示例:

class IBaseA
{
public:
virtual void DoA() = 0;
};

class IBaseB
{
public:
virtual void DoB() = 0;
};

// The same interface, now based on multiple smaller interfaces
class IBig : public IBaseA, public IBaseB
{
};

class CBaseA: public IBaseA
{
public:
virtual void DoA()
{
printf("DoA\n");
}
};

class CBaseB: public IBaseB
{
public:
virtual void DoB()
{
printf("DoB\n");
}
};

// Inherit from base classes where the implementation is, and from IBig as
// the instance of CBig is returned as IBig.
class CBig: public CBaseA, public CBaseB, public IBig
{
};

这里的问题是类 CBig 不能被实例化。编译器说函数 DoA 和 DoB 是纯虚拟的,即使它们是在 CBaseA 和 CBaseB 中实现的。不想再实现函数,只想调用基类的函数怎么办?

注意:我知道设计很丑,但这只是暂时的,直到可以更换大界面,而且......我想明白! ;-)

提前致谢!

最佳答案

这里要用虚继承。此功能可确保在实例化子类时只有一个虚拟继承基类的实例。对于您的示例,这看起来像:

#include <cstdio>

class IBaseA
{
public:
virtual void DoA() = 0;
};

class IBaseB
{
public:
virtual void DoB() = 0;
};

// The same interface, now based on multiple smaller interfaces
class IBig : virtual public IBaseA, virtual public IBaseB
// ^ ^
{
};

class CBaseA: virtual public IBaseA
// ^
{
public:
virtual void DoA()
{
printf("DoA\n");
}
};

class CBaseB: virtual public IBaseB
// ^
{
public:
virtual void DoB()
{
printf("DoB\n");
}
};

// Inherit from base classes where the implementation is, and from IBig as
// the instance of CBig is returned as IBig.
class CBig: public CBaseA, public CBaseB, public IBig
{
};

int main()
{
CBig cb;
}

以上改动保证了多次继承IBaseA和IBaseB时不会创建额外的DoA和DoB声明。

关于c++ - 虚拟多接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31159824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com