Xun*_*ang 7 c++ inheritance arduino
我正在研究微处理器(Arduino)项目.我的库Foo继承自现有的库Basic.后来我将其功能扩展Basic到了另一个类Advanced.然而,Advanced更难以延伸硬件,使已经制作的一个演示无法使用.
我在想的是如下:
class Foo:
#ifndef USE_BASIC
public Advanced
#else
public Basic
#endif
{
...
}
Run Code Online (Sandbox Code Playgroud)
并#define USE_BASIC输入我的演示代码:
#define USE_BASIC
#include <Foo.h>
Run Code Online (Sandbox Code Playgroud)
但是,Foo不是继承自Basic.我在这做错了吗?或者,如果有其他方法可以解决这个问题?
Naw*_*waz 18
更简洁的解决方案是使用模板:让编译器根据模板参数选择基类.
这是一个例子:
#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
};
Run Code Online (Sandbox Code Playgroud)
以下是您将如何使用此类:
Foo<true> fooWithAdvanced; //it uses Advanced as base class
Foo<false> fooWithBasic; //it uses Basic as base class!
Run Code Online (Sandbox Code Playgroud)
那是一种方法.但有更好的方法.特别是,我将按以下方式设计类模板,其中模板参数将充当基类.这将是更灵活的设计.
template<typename Base>
class Foo : public Base
{
//your code
};
Run Code Online (Sandbox Code Playgroud)
所以,你可以使用Basic,Advanced或任何其他类作为基类,只要它支持所要求的功能Foo和它的用法:
Foo<Advanced> fooWithAdvanced;
Foo<Basic> fooWithBasic;
Foo<OtherBase> fooWithOtherBase;
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.