Есть класс интерфейса:
class CMyInterface
{
int fd; // port descriptor
public:
CMyInterface(){...}
virtual ~CMyInterface(){...}
virtual bool ReOpen(void){...}
virtual bool Open( TComParam const &cparam ){...}
virtual size_t WriteN( const uint8_t *vptr, size_t len ){...}
virtual size_t ReadN( uint8_t *vptr, size_t n ){...}
virtual bool IsValid(){...}
virtual void Close(){...}
virtual int SetIrqChar(char IrqChr){...}
virtual int GetNextPacket(char *txt_buff, size_t len ) = 0;//!!!Нет реализации!!!
};
и два наследника:
class CMyClass1: public CMyInterface
{
public:
CMyClass1( );
~CMyClass1( );
bool ReOpen(void){... }
bool Open( TComParam const &cparam ){...};
size_t WriteN( const uint8_t *vptr, size_t len )
{
size_t sz = CMyInterface::WriteN(vptr, len);
...
}
size_t ReadN(uint8_t *vptr, size_t n )
{
return CMyInterface::ReadN(vptr, n);
}
int ReadBlock( uint8_t *buf, int len );
int SetIrqChar(char IrqChr)
{
return CMyInterface::SetIrqChar(IrqChr);
}
int GetNextPacket(char *txt_buff, size_t len )
{
......
}
bool IsValid()
{
return CMyInterface::IsValid();
...
}
void Close( ){ CMyInterface::Close(); };
inline void FlushIO( ){...};
};
class CMyClass2: public CMyInterface
{
public:
CMyClass2( );
~CMyClass2( );
bool ReOpen(void){... }
bool Open( TComParam const &cparam ){...};
size_t WriteN( const uint8_t *vptr, size_t len )
{
size_t sz = CMyInterface::WriteN(vptr, len);
...
}
size_t ReadN(uint8_t *vptr, size_t n )
{
CMyInterface::ReadN(vptr, n);
......................
}
int ReadBlock( uint8_t *buf, int len );
int SetIrqChar(char IrqChr)
{
return CMyInterface::SetIrqChar(IrqChr);
}
int GetNextPacket(char *txt_buff, size_t len )
{
......
}
bool IsValid()
{
return CMyInterface::IsValid();
...
}
void Close( )
{
...............
CMyInterface::Close();
};
};
Разница между CMyClass1 и CMyClass2 небольшая.
создание объектов разных типов происходит следующим образом:
CMyInterface* my_ptr; //глобальный указатель
if(true == one_condition)
{
my_ptr = new CMyClass1 ;
}
else
{
my_ptr = new CMyClass2;
}
Дальше я работаю с указателем my_ptr, абстрагируясь от конкретного типа(CMyClass1 или CMyClass2).
В случае когда one_condition == true всё ОК. Когда one_condition == false при обращении к
my_ptr->GetNextPacket программа падает с сообщением segmentation fault.
Вопросы:
1. почему программа падает?
2. как реализовать подобный механизм?