C ++多重继承,多重定义时没有?

Posted

技术标签:

【中文标题】C ++多重继承,多重定义时没有?【英文标题】:C++ multiple inheritance, multiple definition when there isn't? 【发布时间】:2015-02-21 19:44:43 【问题描述】:

我正在为一个嵌入式 C/C++ 项目实现硬件驱动程序,并试图让未来的项目更加灵活。

我在 LCD.hpp/LCD.cpp 中完成了大部分工作,其中有一个类有五个虚拟函数。其中四个用于旋转 GPIO 引脚和发送 SPI 消息,第五个用于实现各种字体。一个简短的类声明如下:

//LCD.hpp
#include <cstdint>

#ifndef LCD_HPP
#define LCD_HPP
class LCD 
    public:
        virtual void write_character(char what) = 0; //Stores data into a buffer in LCD through another function
    protected:
        virtual void SPI_TX(uint8_t *TXData, uint8_t length, bool ToBeContinued) = 0;
        virtual void update_RST(bool pinstate) = 0;
        virtual void update_DC(bool pinstate) = 0;
        virtual void update_backlight(uint8_t brightness) = 0;
;
#endif

继续,我实现了一个字体打印 write_character 。

//LCD_FixedWidth.hpp
#include <cstdint>
#include "LCD.hpp"

#ifndef LCD_FIXEDWIDTH_HPP
#define LCD_FIXEDWIDTH_HPP
class LCD_FixedWidth : virtual public LCD 
    public:
        void write_character(char what);
;
#endif

现在是各种硬件位的时候了。

//LCD_hardware.hpp
#include <cstdint>
#include "LCD.hpp"
#include "LCD_FixedWidth.hpp"

#ifndef LCD_HARDWARE_HPP
#define LCD_HARDWARE_HPP
class LCD_hardware : virtual public LCD 
    protected:
        void SPI_TX(uint8_t *TXData, uint8_t length, bool ToBeContinued);
        void update_RST(bool pinstate);
        void update_DC(bool pinstate);
        void update_backlight(uint8_t brightness);
;

然后是一个类将它们联系在一起,仍然在 LCD_hardware.hpp...

class LCD_meta : public LCD_hardware, public LCD_FixedWidth 
    public:
        void write_character(char what)  LCD_FixedWidth::write_character(what); ;
    protected:
        void SPI_TX(uint8_t *TXData, uint8_t length, bool ToBeContinued)  LCD_hardware::SPI_TX(TXData, length, ToBeContinued); ;
        void update_RST(bool pinstate)  LCD_hardware::update_RST(pinstate); ;
        void update_DC(bool pinstate)  LCD_hardware::update_DC(pinstate); ;
        void update_backlight(uint8_t brightness)  LCD_hardware::update_backlight(brightness); ;
;
#endif

对于所有这些,我得到了 LCD_FixedWidth::write_character(char) 错误的多重定义。有人看到我在这里缺少的东西吗?我所有的标头都得到了适当的保护,我只能看到 write_character 的一种实现......

【问题讨论】:

解决所有错别字后,What seems to be broken? 介意在您的问题中逐字提供该错误消息吗? “multiple definition”听起来像是链接器错误,表示函数LCD_FixedWidth::write_character(char)有多个定义。请搜索您的源文件并确保该函数只有一个定义。 子类驻留在哪些文件中? 首先,您需要将其分解为展示该行为的最简单的示例。其次,用它所在的文件的名称标记每个块,第三,您需要为每个文件提供#includes 的完整列表。这些问题通常是您的#include 设置方式的错误,如果没有这些信息,就无法提供帮助。最后,在嵌入式编程中,简化。例如,在 Arduino 上,您的上述实现仅针对 vtable 就消耗了总内存预算的 1%,这就是 PER INSTANCE。这对“未来的项目不灵活”。 【参考方案1】:

这是由于 LCD_meta 和 LCD_hardware 在同一个头文件中造成的。 LCD_hardware 函数的代码在一个实现文件中,因此 LCD_meta 类实际上还没有定义这些函数……每个文件一个类!

【讨论】:

以上是关于C ++多重继承,多重定义时没有?的主要内容,如果未能解决你的问题,请参考以下文章

多继承 与 多重继承

C ++如何从具有不同返回类型的接口多重继承?

Python入门-6面向对象编程:08多重继承-mro()-super()获得父类的定义

Python学习笔记__7.3章 多重继承

c++头脑风暴-多态虚继承多重继承内存布局

c++头脑风暴-多态虚继承多重继承内存布局