Наследование в C ++: определение указателя на производный или базовый класс

0

Если у меня есть производный класс из базового класса, и я бы хотел назначить указатель на объект любого из них на основе флага, каким должно быть определение указателя, относящегося к выбранному объекту.

Пример:

void main(int argc, char* argv[])
{
   class Base B;
   class Derived D;
   class Base *P;  /* My question is output this definition */
   int flag;   /* This will be an input */
   if(flag)
      P = &B;   /* Should refer to the base class B */
   else
      P = &D;   /* Should refer to the derived class D
   /* Then I'd use P in the rest of my code */ 
} 

Мой вопрос в том, как определить класс указателя P, чтобы он мог ссылаться либо на B (базовый класс), либо на D производный класс) на основе флага "flag"?

  • 1
    Это нормально, если Derived получен из Base . Что не работает для вас?
  • 0
    Спасибо, ххх Я пытался убедиться в своем решении. Я был сбит с толку насчет определения части. Можно ли определить P как указатель на базовый класс, а затем присвоить ему указатель на производный класс? Кстати, будет ли работать и другой способ (т. Е. Определить P следующим образом: class Derived * P;)?
Показать ещё 4 комментария
Теги:
class
pointers
inheritance

1 ответ

3

Предполагая, что код имеет базовую форму:

class Base
{
public:
   virtual ~Base() {}
};

class Derived : public Base
{};

Затем Derived является Base соответствии с языковыми правилами, поэтому указатель на базовый класс может содержать либо Derived либо Base.

Base* p = nullptr;
Base b;
Derived d;

if(flag == UseBase)
{    
   // Works
   p = &b;
}
else if(flag == UseDerived)
{
   // also works
   p = &d;
}

Тем не менее, Base не является Derived, поэтому обратное (Derived* pd = &b) не будет работать так, как указано выше.

  • 0
    Спасибо Чад. Должен ли я использовать виртуальный внутри базового класса?
  • 0
    Если вы когда-нибудь намереваетесь использовать динамическое выделение памяти ( new ) и освободите память ( delete ) через указатель базового класса, то да, virtual деструктор необходим для гарантированного правильного поведения.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню