Как вызвать переопределенную функцию родительского класса в C ++?
На самом деле вы не переопределили ни одну функцию в своем примере. Только виртуальные функции-члены могут быть переопределены, и display
не является виртуальным.
Я использовал статическое связывание для успешного вызова функции-члена display () родительского класса
Ваше решение работает, потому что в нем нет переопределенных или виртуальных функций. Другой способ вызова скрытой функции-члена - использовать оператор разрешения области:
c.Parent::display();
При этом будет использоваться статическое связывание, даже если функция была виртуальной.
Чтоэто цель иметь эту строку Parent *p = new Child();
?
Кажется, она не имеет никакой цели в вашей программе. В общем, new
используется для динамического выделения объектов из свободного хранилища.
Обратите внимание, что память будет утечка, если вы явно не освободите ее с помощью delete
. Также не то, что delete p
будет иметь неопределенное поведение, потому что оно указывает на базу, деструктор которой не виртуален.
Указатель, указывающий на конструктор?
Нет. p
указывает на динамический объект, который был создан в бесплатном хранилище.
В чем разница между этой строкой и Parent *p = new Child;
?
Без скобок используется синтаксис инициализации по умолчанию. С пустыми скобками вы используете значение инициализации.
В случае тривиально возводимых классов (таких как Parent
), инициализация по умолчанию будет инициализировать элементы по умолчанию. В случае целочисленных членов, это оставляет членов неинициализированными. Вместо этого инициализация значения будет инициализировать значения членов, что для целых чисел означает инициализацию на ноль.
В случае нетривиально конструируемых классов (таких как Child
) инициализация по умолчанию и инициализация значения вызывают конструктор по умолчанию.