C++:条件继承是否可能

标签 c++ inheritance arduino

我正在从事微处理器 (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
 };

因此您可以使用BasicAdvanced任何其他类作为基类,只要它支持Foo 及其用法:

 Foo<Advanced>  fooWithAdvanced;
 Foo<Basic>     fooWithBasic;
 Foo<OtherBase> fooWithOtherBase;

希望对您有所帮助。

关于C++:条件继承是否可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16358804/

相关文章:

c# - 方法属性在 C# 中是继承的吗?

Python:确保所有子类方法返回相同的内容

c++ - 使用和不使用默认构造函数声明泛型类有什么区别?

c++ - 为最终的 future 自定义内存分配器做准备

javascript - 实例化对象真的只是在 javascript 中以某种方式继承吗?

rgb - Arduino RGB LED 清除

C - 如何使用 PROGMEM 存储和读取字符数组

timer - Timer1 arduino使Serial不起作用

c++ - 在同一个程序中调用 srand() 两次

c++ - QWidget 中的 SDL_Surface