Снова правильно выводится «Производный класс».Тем не менее, если я составлю такой список:
Нет.Он не может печатать «Производный класс».Фактически, эта строка:
b=&d;
даст ошибку компиляции , поскольку b
не является полиморфным основанием d
.
Объявить show
как virtual
, в базовом классе:
virtual void show();
Тогда это скомпилируется.
Однако даже после того, как виртуальный show
выдвинет объект производного класса, в список вызовет разбиение объекта , поскольку список может содержать только объекты базового класса;это означает, что список получит подобъект объекта производного класса.Это потому, что вы объявили список как:
list<baseClass> t;
, что неверно.
Объявите его как:
list<baseClass*> t;
и нажмите pointer
на объектвот так:
derivedClass d;
derivedClass *pd = new derivedClass;
baseClass b;
t.push_back(&d);
t.push_back(pd); //note there is no `&`
t.push_back(&b);
//use t
//must delete pd
delete pd;
-
Просто отметьте, что если вы хотите удалить объекты производного класса, используя указатель типа базового класса, что-то вроде этого:
baseClass *bptr = new derivedClass();
delete bptr;
тогда вы должны определить деструктор baseClass
как виртуальный, в противном случае приведенный выше оператор удаления вызовет неопределенное поведение.
Так что сделайте это:
class baseClass:
{
//...
virtual ~baseClass();
};