Если у меня есть производный класс из базового класса, и я бы хотел назначить указатель на объект любого из них на основе флага, каким должно быть определение указателя, относящегося к выбранному объекту.
Пример:
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"?
Предполагая, что код имеет базовую форму:
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
) не будет работать так, как указано выше.
new
) и освободите память ( delete
) через указатель базового класса, то да, virtual
деструктор необходим для гарантированного правильного поведения.
Derived
получен изBase
. Что не работает для вас?