Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> полиморфизм 
:(
    Опции темы
slayerblya
Дата 27.2.2011, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.2.2011

Репутация: нет
Всего: нет



объясните зачем вообще придумали эти vptr'ы, позднее связывание..
почему компилятор не может просто посмотреть на какой фактически объект указывает указатель и вызвать соответствующую функцию?


M
JackYF
Никому не интересна чужая срочность.
При употреблении матов есть риск отправиться в бан.

PM MAIL   Вверх
boostcoder
Дата 27.2.2011, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(slayerblya @  27.2.2011,  01:51 Найти цитируемый пост)
почему компилятор не может просто посмотреть на какой фактически объект указывает указатель и вызвать соответствующую функцию?

пример:
Код

#include <iostream>
#include <cstring>

struct base {
   virtual void show() = 0;
};

struct derived: base {
   virtual void show() {
      std::cout << "derived::show()" << std::endl;
   }
};

struct derived2: base {
   virtual void show() {
      std::cout << "derived2::show()" << std::endl;
   }
};

int main() {
   char id[] = "derived2"; // user entered
   base* b = 0;
   if ( !strcmp(id, "derived") ) {
      b = new derived;
   } else if ( !strcmp(id, "derived2") ) {
      b = new derived2;
   }
   b->show();
}


http://liveworkspace.org/code/98838d7cf5b3...dd825096d285ec8

как в этом случае компилятор узнает о том, какое имя ввел юзер? ;)

PM WWW   Вверх
volatile
Дата 27.2.2011, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(slayerblya @  27.2.2011,  01:51 Найти цитируемый пост)
почему компилятор не может просто посмотреть на какой фактически объект указывает указатель и вызвать соответствующую функцию

Во время компиляции, неизвестно на какой объект будет указывать указатель. Так что это делается в рантайме.
В принципе, то что вы написали, это программа и делает. Смотрит на какой объект указывает указатель и вызывает соответствующую функцию smile 
PM MAIL   Вверх
slayerblya
Дата 27.2.2011, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.2.2011

Репутация: нет
Всего: нет



гыгы 
спасибо ))
PM MAIL   Вверх
bsa
Дата 27.2.2011, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(volatile @  27.2.2011,  02:24 Найти цитируемый пост)
Смотрит на какой объект указывает указатель и вызывает соответствующую функцию

Не совсем так. Объект полиморфного класса можно представить в виде структуры:
Код
/*
class Base
{
    virtual ~Base();
    virtual void method1();
    virtual void method2();
    void method3();
private:
    int data;
};
*/
struct Base
{
    struct VTable {
        const char *typeName;
        void (*destructor)(Base *this);
        void (*method1)(Base *this);
        void (*method2)(Base *this);
    };
    const VTable *vptr;
    static const VTable __vTable;
    int data;
};

const Base::VTable Base::__vTable = 
{
   "N4Base",
   &Base::~Base,
   &Base::method1,
   &Base::method2,
};
Ну вот, примерно так изнутри выглядит каждый полиморфный класс. Конструктор каждого класса присваивает полю vptr указатель на его собственную  таблицу. Таким образом, если у нас от класса Base наследуется Derived, то при создании экземпляра класса Derived будет вызван сначала конструктор Base, который полю vptr присвоит указатель на Base::__vTable, а затем конструктор Derived присвоит этому полю Derived::__vTable. В деструкторах все с точностью до наоборот (т.е. перед входом в деструктор восстанавливается таблица этого класса).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0874 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.