Как мне вызвать родительскую функцию из производного класса, используя C ++? Например, у меня есть класс с именем parent
и класс, child
который является производным от parent. Внутри каждого класса есть print
функция. В определении функции печати ребенка я хотел бы вызвать функцию печати родителей. Как бы я поступил так?
c++
oop
inheritance
IaCoder
источник
источник
Ответы:
Я рискну заявить об очевидном: вы вызываете функцию, если она определена в базовом классе, она автоматически доступна в производном классе (если только
private
).Если в производном классе есть функция с такой же сигнатурой, вы можете устранить ее неоднозначность, добавив имя базового класса, за которым следуют два двоеточия
base_class::foo(...)
. Вы должны заметить, что в отличие от Java и C #, C ++ не имеет ключевого слова для «базового класса» (super
илиbase
), поскольку C ++ поддерживает множественное наследование, что может привести к неоднозначности.Между прочим, вы не можете наследовать напрямую от одного и того же класса дважды, так как не будет никакого способа сослаться на один из базовых классов поверх другого.
источник
template<class A, class B> class C: public A, public B {};
два типа могут быть одинаковыми по причинам, в зависимости от того, как используется ваш код (что делает А и В одинаковыми), может быть два или три уровень абстракции от кого-то, кто не знает, что вы сделали.using namespace std
.Учитывая родительский класс named
Parent
и дочерний класс namedChild
, вы можете сделать что-то вроде этого:Обратите внимание, что
Parent
это фактическое имя класса, а не ключевое слово.источник
foo()
здесь аналогичнаprint()
или отдельной функции? И вы имеете в виду, используяprivate
наследование, чтобы скрыть детали, унаследованные от базы, и предоставляяpublic
функции теневого копирования для вещей, которые вы хотите показать?foo()
было аналогичноprint()
. Позвольте мне вернуться к использованию, такprint()
как я думаю, что это будет иметь больше смысла в этом контексте. Допустим, кто-то создал класс, который выполнил некоторый набор операций с определенным типом данных, открыл некоторыеprint(obj&)
методы доступа и имел метод. Мне нужен новый класс, который работает,array-of-obj
но все остальное то же самое. Композиция приводит к большому количеству дублированного кода. Наследование сводит это к минимуму приprint(array-of-obj&)
вызове циклаprint(obj&)
, но не хочет, чтобы клиенты звонили,print(obj&)
потому что для них это не имеет смыслаЕсли ваш базовый класс вызывается
Base
, а ваша функция вызывается,FooBar()
вы можете вызвать его напрямую, используяBase::FooBar()
источник
В MSVC для этого есть специальное ключевое слово Microsoft: __super
MSDN: позволяет явно указать, что вы вызываете реализацию базового класса для функции, которую вы переопределяете.
источник
typdef
чтобы родитель был чем-то вродеsuper
.__super
; Я упомянул это здесь как альтернативное предложение. Разработчики должны знать свой компилятор и понимать плюсы и минусы его возможностей.Если модификатор доступа к функции-члену базового класса защищен ИЛИ общедоступен, вы можете вызвать функцию-член базового класса из производного класса. Можно вызвать не виртуальную и виртуальную функцию-член базового класса из производной функции-члена. Пожалуйста, обратитесь к программе.
Вывод:
источник
virtual
!Вызовите родительский метод с оператором разрешения родительской области.
источник
Справочный пример.
источник