Как уже упоминалось, следующее будет работать без проблем
foo->do_a();
bar->do_b();
Они, однако, не будут компилироваться
bar->do_a();
foo->do_b();
Поскольку bar
относится к типу b*
, он не знает do_a
. То же самое верно для foo
и do_b
. Если вы хотите сделать эти вызовы функций, вы должны понизить.
static_cast<c *>(foo)->do_b();
static_cast<c *>(bar)->do_a();
Другая очень важная вещь, которая не показана в вашем примере кода, заключается в том, что при наследовании и обращении к производному классу через указатель базового класса базовый класс ДОЛЖЕН иметь виртуальный деструктор . Если этого не произойдет, следующее приведет к неопределенному поведению.
a* foo = new c();
delete a;
Исправление простое
class a {
public:
virtual void do_a() = 0;
virtual ~a() {}
};
Конечно, это изменение также необходимо внести в b
.