Hello I’m working on a program (or a redesign of a program) and I was trying to improve my c++ while doing so, eventually I ran into a situation where using dynamic casting would be ideal, to cut it short here’s a minimal reproducible example:
class Base{
public:
void virtual Function_To_Force_Class_To_Be_Polymorphic(void);
char cBase;
};
class Derived1 : public Base{
public:
char cDerived1;
};
class Derived2 : public Base{
public:
char cDerived2_1;
char cDerived2_2;
};
void Function(Base *baseClassPointerArgument){
Derived1 *baseClassPointerTemporal = 0x0000;
baseClassPointerTemporal = dynamic_cast<Derived1 *> (baseClassPointerArgument);
if( baseClassPointerTemporal != 0x0000){
Serial.println("class is of type Derived1");
Serial.println( baseClassPointerTemporal->cBase );
Serial.println( baseClassPointerTemporal->cDerived1 );
}
else{
Serial.println("class is not of type Derived1");
Serial.println( baseClassPointerArgument->cBase );
}
};
//------------------------------------------------------------------------------------------------------------------------
void setup(){
Derived1 d1;
d1.cBase = 'a';
d1.cDerived1 = 'b';
Function(&d1);
}
generates the following errors:
C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o: In function
main': <artificial>:(.text.startup+0x1ba): undefined reference to
typeinfo for Base’
:(.text.startup+0x1bc): undefined reference totypeinfo for Base' <artificial>:(.text.startup+0x1c2): undefined reference to
__dynamic_cast’
C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x63): undefined reference tovtable for __cxxabiv1::__si_class_type_info' C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x69): undefined reference to
vtable for __cxxabiv1::__class_type_info’
C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x6d): undefined reference tovtable for __cxxabiv1::__si_class_type_info' C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x73): undefined reference to
vtable for __cxxabiv1::__class_type_info’
C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x77): undefined reference tovtable for __cxxabiv1::__si_class_type_info' C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x7d): undefined reference to
vtable for __cxxabiv1::__si_class_type_info’
C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x83): undefined reference tovtable for __cxxabiv1::__si_class_type_info' C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x87): undefined reference to
typeinfo for Base’
C:\Users\Santiago\AppData\Local\Temp\ccpnyaCO.ltrans0.ltrans.o:(.rodata+0x8d): undefined reference to `Base::Function_To_Force_Class_To_Be_Polymorphic()’
platformIO.ini:
[env:uno]
platform = atmelavr
board = megaatmega2560
framework = arduino
upload_port = COM7
build_flags =
-I/Users/Santiago/Documents/Projects/pulse_commander/headers
-Wno-reorder ; To ignore warnings about reordering on list initializers.
-Wno-pointer-arith ; To ignore warnings about casting void pointers, used on a couple of subroutines.
-Werror=parentheses ; I can't remember why this is here.
-Winline ; To force the compiler to warn when a function marked inline has not been inlined.
-frtti ; To allow dynamic casting