C语言使用技巧3:C++中子类调用父类重载函数的方法
2017-09-14 22:55
507 查看
在项目中遇到如下问题,请看程序。
父类中声明了SendData函数。
class CUart
{
public:
UART_HandleTypeDef hUART;
uint8_t u8_UartReceiveBuffer[1];
public:
CUart(uint8_t u8_UartNumber, uint32_t u32_BaudRate);
void SendData(uint8_t* pData, uint8_t u8_Size);
};
子类对SendData函数进行了重载。
class CSevenBytesUART:public CMiniUART
{
public:
uint8_t u8_Command;
uint8_t u8_Data1;
uint8_t
u8_Data2;
uint8_t u8_Data3;
public:
CSevenBytesUART(uint8_t u8_UartNumber, uint32_t u32_BaudRate);
void SendData(uint8_t u8_Command, uint8_t u8_Data1, uint8_t u8_Data2, uint8_t u8_Data3);
boolean IsCorrectDataPack(void);
};
在main.c中调用父类的SendData函数程序报错,报错信息是不认识父类的SendData函数。
while(1)
{
Target.Delayms(1000);
Target.HAL.DeviceUart.SelectDevice(0);
if (Target.HAL.DeviceUart.IsReceivedData() == TRUE)
{
Target.HAL.DeviceUart.SendData(Target.HAL.DeviceUart.u8_Buffer, (uint8_t)Target.HAL.DeviceUart.u16_Number);
}
}
原因:实际上在子类中声明与父类同名的函数,不应称做重载,而应称做覆盖。
解决方法:在子类中引入父类的同名函数即可,使用的语句是using,程序如下:
class CSevenBytesUART:public CMiniUART
{
public:
uint8_t u8_Command;
uint8_t u8_Data1;
uint8_t
u8_Data2;
uint8_t u8_Data3;
public:
CSevenBytesUART(uint8_t u8_UartNumber, uint32_t u32_BaudRate);
using CMiniUART::SendData;
void SendData(uint8_t u8_Command, uint8_t u8_Data1, uint8_t u8_Data2, uint8_t u8_Data3);
boolean IsCorrectDataPack(void);
};
这样,就解决了该问题。
原创性文章,转载请注明出处 http://user.qzone.qq.com/2756567163。
CSDN:http://blog.csdn.net/qingwufeiyang12346。
父类中声明了SendData函数。
class CUart
{
public:
UART_HandleTypeDef hUART;
uint8_t u8_UartReceiveBuffer[1];
public:
CUart(uint8_t u8_UartNumber, uint32_t u32_BaudRate);
void SendData(uint8_t* pData, uint8_t u8_Size);
};
子类对SendData函数进行了重载。
class CSevenBytesUART:public CMiniUART
{
public:
uint8_t u8_Command;
uint8_t u8_Data1;
uint8_t
u8_Data2;
uint8_t u8_Data3;
public:
CSevenBytesUART(uint8_t u8_UartNumber, uint32_t u32_BaudRate);
void SendData(uint8_t u8_Command, uint8_t u8_Data1, uint8_t u8_Data2, uint8_t u8_Data3);
boolean IsCorrectDataPack(void);
};
在main.c中调用父类的SendData函数程序报错,报错信息是不认识父类的SendData函数。
while(1)
{
Target.Delayms(1000);
Target.HAL.DeviceUart.SelectDevice(0);
if (Target.HAL.DeviceUart.IsReceivedData() == TRUE)
{
Target.HAL.DeviceUart.SendData(Target.HAL.DeviceUart.u8_Buffer, (uint8_t)Target.HAL.DeviceUart.u16_Number);
}
}
原因:实际上在子类中声明与父类同名的函数,不应称做重载,而应称做覆盖。
解决方法:在子类中引入父类的同名函数即可,使用的语句是using,程序如下:
class CSevenBytesUART:public CMiniUART
{
public:
uint8_t u8_Command;
uint8_t u8_Data1;
uint8_t
u8_Data2;
uint8_t u8_Data3;
public:
CSevenBytesUART(uint8_t u8_UartNumber, uint32_t u32_BaudRate);
using CMiniUART::SendData;
void SendData(uint8_t u8_Command, uint8_t u8_Data1, uint8_t u8_Data2, uint8_t u8_Data3);
boolean IsCorrectDataPack(void);
};
这样,就解决了该问题。
原创性文章,转载请注明出处 http://user.qzone.qq.com/2756567163。
CSDN:http://blog.csdn.net/qingwufeiyang12346。
相关文章推荐
- c++ 子类调用父类构造方法 调用父类方法 类声明与实现分离
- Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法
- C++和JAVA中一些区别,包括指向子类的引用会调用谁的方法,子类构造函数自动调用父类构造函数时,父构造会调用的谁方法
- 关于C++中子类调用父类方法的一个问题
- python中子类调用父类方法几点细节(正确使用super)
- 子类继承父类时,子类与父类有同名变量,当使用子类对象调用父类方法使用同名变量,这个变量是子类的,还是父类的?(转)
- C++ 子类B重载父类A的方法funA后,在父类A中调用funA会调用子类B还是父类A的funA方法?
- 子类调用父类方法:c++和java的不同
- C++虚函数表解析(图文并茂,非常清楚)( 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法)good
- c++和java中关于如何调用父类方法和子类方法的辨析
- c++ 父类和子类的方法调用
- c++多态,子类和父类方法的调用
- 关于C++中子类调用父类方法的一个问题
- 一个子类要调用父类的方法时,默认是使用this还是super?
- c++与java中子类中调用父类成员的方法
- C++关于子类调用父类的构造方法的问题
- 子类与父类属性或方法重名时,使用super.(属性名/方法名)调用父类型属性或方法
- 父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数.
- C++父类子类中虚函数的使用