Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2015, 14:48   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Многоуровневый полиморфизм

Всем доброго дня !

Подскажите пожалуйста почему при отсутствии в классе С метода

void hgh() вызывается метод void hgh() класса В, а не А ?

Код:
A *d = new C;
Может ли это объясняться тем , что фактически указатель d содержит в

себе типы А,B,C и тем самым происходит вызов метода из класса на уровень

выше (при наличии в этом классе замещенного метода) ?

Код:
#include <stdio.h>
#include <conio.h>

class A

{

public:

	A() {printf("\nKONSTRUKTOR class A this = %p\n",this);}
	virtual ~A() {printf("\nDESTRUKTOR class A this = %p\n",this);}
	virtual void hgh() const  = 0 {printf("\nhgh() class A this = %p\n",this);}
	virtual void gh() const {printf("\ngh() class A this = %p\n",this);}
};

class B : public A

{

public:

	B() {printf("\nKONSTRUKTOR class B this = %p\n",this);}
	~B() {printf("\nDESTRUKTOR class B this = %p\n",this);}
	void hgh() const {printf("\nhgh() class B this = %p\n",this);}
	//void gh() const {printf("\ngh() class B this = %p\n",this);}
};


class C : public B

{

public:

	C() {printf("\nKONSTRUKTOR class C this = %p\n",this);}
	~C() {printf("\nDESTRUKTOR class C this = %p\n",this);}
	//void hgh() const {printf("\nhgh() class C this = %p\n",this);}
	//void gh() const {printf("\ngh() class C this = %p\n",this);}
};


int main()

{
	A *d = new C;

	printf("\nd = %p\n",d);

	d->hgh();

	delete d;

	getch();

	return 0;
}
RAFA91 вне форума Ответить с цитированием
Старый 02.08.2015, 17:02   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Класс-наследник наследует все методы и переменные класса родителя.
waleri вне форума Ответить с цитированием
Старый 02.08.2015, 17:09   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Класс-наследник наследует все методы и переменные класса родителя.
класс A это тоже по сути родитель.

Код:
A *d = new C;
RAFA91 вне форума Ответить с цитированием
Старый 02.08.2015, 17:39   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
класс A это тоже по сути родитель.
Код:
A *d = new C;
Когда конструируется класс С - сначала вызывается конструктор А, потом В, потом С.
Потому что ты написал это:
Код:
class B : public A
Код:
class C : public B
Ты используешь виртуальные функции, которые переопределяются в классах наследниках. Каждый объект класса, содержащего виртуальные методы хранит таблицу (массив указателей на функции) виртуальных методов, из таблицы берется указатель и вызывается соответствующая функция.
Считай, что если в классе реализуется виртуальный метод - то указатель на него помещается в таблицу (затирая предыдущее значение если оно было).

Т.е. когда конструируется класс В - то затираются указатели на виртуальные методы класса А. Если затем вызывается конструктор класса С - то указатели обновляются еще раз.

Это очень схематично и не совсем верно, быть может, но думаю тебе поможет
rrrFer вне форума Ответить с цитированием
Старый 02.08.2015, 20:30   #5
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Код:
virtual void hgh() const  = 0 {printf("\nhgh() class A this = %p\n",this);}
а это разве будет работать?
он сначала объявил чистую виртуальную функцию, делающий класс А абстрактным? а следом описывает тело?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 02.08.2015, 20:35   #6
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

Цитата:
Подскажите пожалуйста почему при отсутствии в классе С метода
void hgh() вызывается метод void hgh() класса В, а не А ?
Код я особо не читал (для меня это сложновато), но исходя из комментариев других, могу сказать: потому что ты переопределил метод в классе-наследнике.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 02.08.2015, 20:48   #7
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
а это разве будет работать?
Не должно.
Цитата:
10.4 Abstract classes

2. ...
[Note: A function declaration cannot provide both a pure-specifier and a definition — end note] [ Example:
Код:
struct C {
   virtual void f() = 0 { }; // ill-formed
};
— end example ]
Croessmah вне форума Ответить с цитированием
Старый 02.08.2015, 20:52   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Код:
virtual void hgh() const  = 0 {printf("\nhgh() class A this = %p\n",this);}
а это разве будет работать?
он сначала объявил чистую виртуальную функцию, делающий класс А абстрактным? а следом описывает тело?
Напрямую - нет, но наследник может вызывать родительскую версию полным именем.

Edit:
А, если речь о том можно ли именно так описывать, то да, не по стандарту, но у MS катит.

Последний раз редактировалось waleri; 02.08.2015 в 20:55.
waleri вне форума Ответить с цитированием
Старый 02.08.2015, 22:31   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Код:
virtual void hgh() const  = 0 {printf("\nhgh() class A this = %p\n",this);}
а это разве будет работать?
он сначала объявил чистую виртуальную функцию, делающий класс А абстрактным? а следом описывает тело?
это будет работать в вижал-студии.
но это не по стандарту.

по стандарту, нельзя реализовать туловище чисто-виртуальной функции-члена в декларации класса.

поэтому, его следует выносить за пределы класса.
например - в файл спп.
_Bers вне форума Ответить с цитированием
Старый 02.08.2015, 23:06   #10
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
это будет работать в вижал-студии.
но это не по стандарту.

по стандарту, нельзя реализовать туловище чисто-виртуальной функции-члена в декларации класса.

поэтому, его следует выносить за пределы класса.
например - в файл спп.
Не буду конечно спрашивать закой вообще такое делать, но как по мне в этом нет логической нитки (мысли), должно быть что-то одно. В моём понимании. Более того, я не нашёл даже это в офф справке msdn, если это работает в MS.
Для ТС, virtual function. От себя добавлю, что с виртуальными функциями нужно быть осторожнее, хотя я имею привычку писать виртуальный деструктор, в отличии от стандартной библиотеки, которая его не имеет.
это хаб
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 02.08.2015 в 23:08.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многоуровневый if/else Bender1000 JavaScript, Ajax 9 04.12.2014 15:48
Многоуровневый нумерованный список Word2010 КарандашТМ Microsoft Office Word 3 13.09.2014 18:29
Многоуровневый список в ворде. NewLamer&Programer Помощь студентам 1 28.06.2013 09:31
многоуровневый комбобокс на основе ExtJS sashonk JavaScript, Ajax 0 02.09.2010 16:58
Многоуровневый заголовок (Delphi) VadEr Помощь студентам 1 02.03.2010 14:54