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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2021, 12:25   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Полиморфизм.

Здравствуйте! Не знаю правильно ли я рассуждаю, но, есть задача:
Цитата:
Как в примере Early.cpp узнать, какое связывание используется компилятором при вызове, раннее или позднее? Определите тип связывания для своего компилятора.
Как определить тип связывания? Я, думаю, если создать класс в нём объявить виртуальную функцию, создать производный от него класс в нём переопределить функцию, то при создании объекта производного класса и вызова перегруженной функции результатом будет вызов функции производного класс - значит задействовано позднее связывание. Короче говоря не могу решить, а ещё печальнее то, что материал не усвоен.

Как показать этот факт? позднее или ранее связывание да ещё и для своего компилятора.

Код:
class Base
{
public:
	virtual void f1() const
	{
		cout << "Base::f1()" << endl;
	}
	virtual void f2() const
	{
		cout << "Base::f2()" << endl;
	}
	virtual void f3() const
	{
		cout << "Base::f3()" << endl;
	}
};

class Derived : public Base
{
public:
	void f1() const
	{
		cout << "Derived::f1()" << endl;
	}
	virtual void f4() const
	{
		cout << "Derived::f4()" << endl;
	}
//Если задать функцию без ключевого слова virtual, то получится ранее связывание??
void f5() const 
{

}
};

Derived d1;
	d1.f1();
	d1.f2();  //функция 
	d1.f3();
	d1.f4();
apofioz вне форума Ответить с цитированием
Старый 22.02.2021, 13:09   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Базовая функция устанавливает глобальную переменную в единицу.
Функция в наследнике устанавливает ту же перемнную в двойку.
Вызываем функция через указатель на базовый класс и смотрим что оказалось в переменной - единица или двойка.

Зачем фигней страдать?
waleri вне форума Ответить с цитированием
Старый 22.02.2021, 13:24   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Код:
int sign = 0;
class Base 
{
	public:
		virtual void f1() const 
		{
			sign = 1;
			cout << "Base::f1()" << endl;
		}
		
};

class Derived : public Base
{
public:
	void f2() const //не виртуальная функция))
	{
		cout << "Derived::f2()" << endl;
sign = 2; 
	}
	
};
Derived = d1;
Base* bp = &d1;
	bp->f1();
	bp->f2();
	//bp->f3();
Как-то так?
Не кажется ли что это как-то не совсем то, как тут понять полиморфизм со всеми этими vptr vtble?
Цитата:
Сообщение от waleri Посмотреть сообщение
Зачем фигней страдать?
В смысле, где я ей страдаю...

Последний раз редактировалось apofioz; 23.02.2021 в 11:57.
apofioz вне форума Ответить с цитированием
Старый 22.02.2021, 16:03   #4
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Значит, если я правильно понимаю, то определить это возможно, только посмотрев в дизассемблированный листинг?
Код:
Dog ralph;
	lea         ecx,[ralph]  
	call        Dog::Dog (03515E6h) 
	
    69: 	Pet* p1 = &ralph;
	lea         eax,[ralph]  
	mov         dword ptr [p1],eax  
    70: 	Pet& p2 = ralph;
	
	lea         eax,[ralph]  
	mov         dword ptr [p2],eax  
	
    71: 	Pet p3;
	lea         ecx,[p3]   //видимо, ранее связывание.
	call        Pet::Pet (0351357h)
как-то так?

Последний раз редактировалось apofioz; 22.02.2021 в 16:34.
apofioz вне форума Ответить с цитированием
Старый 22.02.2021, 16:49   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Никому данная тема не интересна что ли? Ауу...
apofioz вне форума Ответить с цитированием
Старый 22.02.2021, 23:37   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
В смысле, где я ей страдаю...
Вот здесь:
Цитата:
Сообщение от apofioz Посмотреть сообщение
Как определить тип связывания?
Правильный ответ - посмотреть на декларацию метода.


Цитата:
Сообщение от apofioz Посмотреть сообщение
void f1() const //не виртуальная функция))
С чего вы решили, что это не виртуальная функция?
waleri вне форума Ответить с цитированием
Старый 23.02.2021, 00:40   #7
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вот здесь:
Ну, если пытаться что-то освоить это страдать ерундой, то да, страдаю.


Цитата:
Сообщение от waleri Посмотреть сообщение
Правильный ответ - посмотреть на декларацию метода.
Что это значит? Если есть virtual то позднее, если нет, то ранее?


Цитата:
Сообщение от waleri Посмотреть сообщение
С чего вы решили, что это не виртуальная функция?
С того, что нет ключевого слова virtual. Есть ещё какие-то причины считать не так?
apofioz вне форума Ответить с цитированием
Старый 23.02.2021, 07:12   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
С того, что нет ключевого слова virtual. Есть ещё какие-то причины считать не так?
Цитата:
Если функция отмечена как виртуальная, то все соответствующие переопределения тоже считаются виртуальными, даже если возле них явно не указано ключевое слова virtual.
пустой текст
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 23.02.2021, 12:03   #9
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

По существу вопроса, как я понял, ничего нет.

Цитата:
Сообщение от apofioz Посмотреть сообщение
посмотреть на декларацию метода
Здесь то я прав?
apofioz вне форума Ответить с цитированием
Старый 23.02.2021, 15:03   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
По существу вопроса
Вам куда существенней - сказано же, смотрите декларацию метода.
В догонку - читайте стандарт языка и/или учебник какой нибудь, где поясняются базовые вещи.
waleri вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Полиморфизм. asmars Общие вопросы C/C++ 31 19.07.2012 12:33
Полиморфизм Кудаив Помощь студентам 3 20.05.2012 14:03
Полиморфизм. Wa1demar Общие вопросы C/C++ 0 04.03.2012 14:23
Полиморфизм Anubys Помощь студентам 1 26.12.2011 20:42
Полиморфизм Zorgan Visual C++ 22 29.08.2011 12:23