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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфизм и позднее связывание, Borland C++ 3.1 
:(
    Опции темы
Vyacheslav
Дата 25.8.2004, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(lynx_916 @ 24.8.2004, 22:19)
Цитата(Vyacheslav @ 24.8.2004, )
вызвать виртуальную

поправочка, чисто виртуальную, а это большая разницца. wink.gif

Я имел в виду следущее
Код

class  Device
{
public:
Device(int i){init(i);}
Device(){}
virtual void TranslateMessage() = 0;
void init(int){ TranslateMessage();}
};

class Pshaiba : public Device
{

public:
Pshaiba(){  }
Pshaiba(int i):Device(i){  }
void TranslateMessage(){ std::cout << "Pshaiba";}
};

int main(int argc, char* argv[])
{
 Pshaiba p;
 Device* d = &p;
 d->init(1);   //  Ok   "Pshaiba"

 Pshaiba p1(1); //Error - вызов чистой виртуальной функции
}





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Конструктор
Дата 25.8.2004, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

Device(int i){init(i);}
virtual void TranslateMessage() = 0;
void init(int){ TranslateMessage();}


ИМХО какой-то изврат, который все же работает как и должен, т.е. пытается вызывать чисто-виртульную ф-цию.
PM MAIL WWW ICQ   Вверх
Borisff2003
Дата 25.8.2004, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Morel
ВЕСЬ Приведенный тобой код работает в VC6.

А кстати, можно ли вызывать виртуальные функции из конструктора?

Это сообщение отредактировал(а) Borisff2003 - 25.8.2004, 13:21
--------------------
Лень, двигатель прогресса
PM MAIL WWW ICQ   Вверх
3,14
Дата 25.8.2004, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



А после компиляции gcc при запуске ошибку кидает


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Vyacheslav
Дата 25.8.2004, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Borisff2003
Дата 26.8.2004, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

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

Что мы и имеем tounge.gif

Это сообщение отредактировал(а) Borisff2003 - 26.8.2004, 05:22
--------------------
Лень, двигатель прогресса
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 26.8.2004, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Кстати на заметку. В С++Builder VCL-ные классы(т.е. те которые являются производными от TObject) ведут себя иначе, нарушая стандарт. При вызове виртуальной функции в конструкторе, она вызывается именно как виртуальная. В результата в принципе возможно переопределять тело базового конструктора smile.gif
Код

class TBaseClass : public TObject
{
public:
    TBaseClass() { BaseConstuctorBody(); }
    virtual void BaseConstuctorBody(){ std::cout << "TBaseClass"; }
};

class TDerivedClass : public TObject
{
public:
    TDerivedClass() :TBaseClass(){ }
    //переопределяем тело базового конструктора  :)
    virtual void BaseConstuctorBody(){std::cout << "DerivedClass"; };
};

Причем эта особенность имеется толькло у VCL-классов. Для обычных все работает по стандарту


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Morel
Дата 26.8.2004, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо вроде разобрался.
Отдельное спасибо за Pshaiba::Pshaiba(int i):Device(i).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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