我正在从事微处理器 (Arduino) 项目。我的库 Foo
继承自现有的库 Basic
。后来我将Basic
的功能扩展到另一个类Advanced
。但是,Advanced
使硬件更加困难,使得其中一个已经制作的演示无法使用。
我的想法如下:
class Foo:
#ifndef USE_BASIC
public Advanced
#else
public Basic
#endif
{
...
}
并将#define USE_BASIC
放入我的演示代码中:
#define USE_BASIC
#include <Foo.h>
但是 Foo 没有继承自 Basic。我在这里做错了吗?或者是否有其他方法可以解决这个问题?
最佳答案
一个更简洁的解决方案是使用模板:让编译器根据模板参数选择基类。
举个例子:
#include <type_traits> //for std::conditional
//here you go with your own class
template<bool UseAdvanced>
class Foo : public std::conditional<UseAdvanced, Advanced, Basic>::type
{
//your code
};
下面是你将如何使用这个类:
Foo<true> fooWithAdvanced; //it uses Advanced as base class
Foo<false> fooWithBasic; //it uses Basic as base class!
嗯,这是一种方法。但是有更好的方法。特别是,我将按以下方式设计类模板,其中模板参数将作为 base 类。这样设计会更灵活。
template<typename Base>
class Foo : public Base
{
//your code
};
因此您可以使用Basic
、Advanced
或任何其他类作为基类,只要它支持Foo
及其用法:
Foo<Advanced> fooWithAdvanced;
Foo<Basic> fooWithBasic;
Foo<OtherBase> fooWithOtherBase;
希望对您有所帮助。
关于C++:条件继承是否可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16358804/