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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2015, 23:19   #11
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
в отличии от стандартной библиотеки, которая его не имеет.
стандартная библиотека не создавалась для полиморфного использования.

Да и наличие виртуального деструктора делает экспорт интерфейсов зависимым от используемого транслятора (я имею ввиду экспорт из разделяемых библиотек).

Последний раз редактировалось Croessmah; 03.08.2015 в 00:41.
Croessmah вне форума Ответить с цитированием
Старый 04.08.2015, 12:32   #12
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Код:
virtual void hgh() const  = 0 {printf("\nhgh() class A this = %p\n",this);}
а это разве будет работать?
а как же. Microsoft Visual C++ 6.0 это допускает.

другие же только так.

Код:
#include <stdio.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 ;
	virtual void gh() const {}
};

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;

	

	return 0;
}
Цитата:
Сообщение от rrrFer Посмотреть сообщение

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

другими словами если virtual void hgh() нету в классе C, то идет вызов ее из класса B при

ее наличии в этом классе. В противном случае идет вызов из класса A.

так понял ?

Последний раз редактировалось RAFA91; 04.08.2015 в 12:40.
RAFA91 вне форума Ответить с цитированием
Старый 04.08.2015, 12:43   #13
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
так понял ?
Вроде бы правильно понял. Так происходит есть функция виртуальная.
Но если функция невиртуальная, то она берется из из класса в зависимости от типа указателя, а не от реального объекта, который создан по этому указателю. Например
Код:
B *obj = new C();
obj->foo();
если foo - невиртуальная функция, то вызовется B::foo().

Последний раз редактировалось rrrFer; 04.08.2015 в 12:52.
rrrFer вне форума Ответить с цитированием
Старый 04.08.2015, 12:50   #14
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Родной. Нет многоуровнево полиморфизма! Полиморфизм, сам-собой предполлагает, что он уже есть. Масло-масляное. Полиморфизм, это когда одна и та же функция, называется разными именами. Каким боком, здесь стояла многоуровневесть?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.08.2015, 13:20   #15
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
то когда одна и та же функция, называется разными именами.?
это как? на сколько я знаю имена функций одинаковое но разная их

реализация в теле.

к примеру функция размножение() есть у рыб и собак.

реализация этих методов у рыб и собак понятное дело разное.
RAFA91 вне форума Ответить с цитированием
Старый 04.08.2015, 13:28   #16
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
это как? на сколько я знаю имена функций одинаковое но разная их

реализация в теле.

к примеру функция размножение() есть у рыб и собак.

реализация этих методов у рыб и собак понятное дело разное.
Тааак. Мы здесь не биологией занимаемся, а программированием. Если про крысок и про собачек, не кажется-ли Вам, что ошиблись фоорумом?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.08.2015, 13:28   #17
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
если foo - невиртуальная функция, то вызовется B::foo().
изменил код до такого вида. тут вертуальности нету.

Код:
C *d = new C;
в этом коде наблюдаются похожие явления.

при отсутствии
Код:
void hgh()
в классе С идет вызов

void hgh() класса В (при ее наличие). В противном случае вызов void hgh()

идет из класса А

Код:
#include <stdio.h>

class A

{

public:

	A() {printf("\nKONSTRUKTOR class A this = %p\n",this);}
	virtual ~A() {printf("\nDESTRUKTOR class A this = %p\n",this);}
	void hgh() const  {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()

{
	C *d = new C;

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

	d->hgh();

	delete d;

	

	return 0;
}
RAFA91 вне форума Ответить с цитированием
Старый 04.08.2015, 14:06   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Родной. Нет многоуровнево полиморфизма! Полиморфизм, сам-собой предполлагает, что он уже есть. Масло-масляное. Полиморфизм, это когда одна и та же функция, называется разными именами. Каким боком, здесь стояла многоуровневесть?
поспите пожалуйста сначала, ок?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2015, 14:10   #19
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

это уже называется "наследование"
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 04.08.2015, 15:07   #20
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
это уже называется "наследование"
как я понимаю полиморфизм это когда мы обьект производного

класса приводим к типу базового.

Код:
A *d = new C;
, что нельзя сказать об этом

Код:
С *d = new C;
где не нужна эта виртуальность так как

вызов функции
Код:
d->hgh();
будет именно из класса С, при

ее наличии
RAFA91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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