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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструкторы и потоки 
V
    Опции темы
rrrFer
Дата 18.6.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(yorgan @  18.6.2008,  15:54 Найти цитируемый пост)
Мы не будем знать что создаем.

есть такая вещь как интерфейсный класс, и там мы посути тоже не знаем что создаем...однако есть такое
PM MAIL WWW ICQ   Вверх
xvr
Дата 18.6.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(bsa @ 18.6.2008,  11:36)
Цитата(xvr @ 18.6.2008,  11:23)
Цитата

И еще спросил можно ли в конструкторе (или деструкторе) использовать виртуальные функции?
Можно, только они не будут там виртуальными. Зато сам деструктор может быть виртуальным, часто этого достаточно.

Я бы уточнил, что нужно явно указывать принадлежность таких методов классу (Base::method() или Derived::method()).

При явном указании принадлежности (через :: ) виртуальности не будет не только в конструкторах и деструкторах  smile Если же из конструктора или деструктора вызвать виртуальную функцию не непосредственно (например так)
Код

class Test {
public:

 virtual ~Test() {func1();}

 void func1() {func2();}
 virtual void func2() {}
};

class Test2 : public Test {
public:
 ~Test2() {}

 virtual void func2() {}
};

Test* t=new Test2;
t->func1(); // Test::func1, Test2::func2
delete t; // Test2::~Test2, Test::~Test, Test::func1, Test::func2
то деструкторе Test2 будет вызванны функции Test::func1 и Test::func2. При вызове t->func1() будут вызванны Test::func1 и Test2::func2


Это сообщение отредактировал(а) xvr - 18.6.2008, 20:09
PM MAIL   Вверх
bsa
Дата 18.6.2008, 20:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xvr @ 18.6.2008,  20:04)
то деструкторе Test2 будет вызванны функции Test::func1 и Test::func2. При вызове t->func1() будут вызванны Test::func1 и Test2::func2

отсюда вывод - нельзя вызывать виртуальные методы из конструктора и деструктора (если только через явное указание принадлежности классу).
PM   Вверх
xvr
Дата 19.6.2008, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(bsa @ 18.6.2008,  20:24)
Цитата(xvr @ 18.6.2008,  20:04)
то деструкторе Test2 будет вызванны функции Test::func1 и Test::func2. При вызове t->func1() будут вызванны Test::func1 и Test2::func2

отсюда вывод - нельзя вызывать виртуальные методы из конструктора и деструктора (если только через явное указание принадлежности классу).

Вывод неправильный - 
Draft 2005, 12.7 p4
Цитата

Member functions, including virtual functions (10.3), can be called during construction or destruction (12.6.2). When a
virtual function is called directly or indirectly from a constructor (including from the mem-initializer for a data member)
or from a destructor, and the object to which the call applies is the object under construction or destruction, the function
called is the one defined in the constructor or destructor’s own class or in one of its bases, but not a function overriding
it in a class derived from the constructor or destructor’s class, or overriding it in one of the other base classes of the most
derived object (1.8). If the virtual function call uses an explicit class member access (5.2.5) and the object-expression
refers to the object under construction or destruction but its type is neither the constructor or destructor’s own class or
one of its bases, the result of the call is undefined. [ Example:
class V {
public :
virtual void f();
virtual void g();
};
class A : public virtual V {
public :
virtual void f();
};
class B : public virtual V {
public :
virtual void g();
B(V*, A*);
};
class D : public A , B {
public :
virtual void f();
virtual void g();
D () : B((A*) this , this ) { }
};
B::B(V* v , A* a) {
f (); / / calls V::f, not A::f
g (); / / calls B::g, not D::g
v->g (); / / v is base of B, the call is well-defined, calls B::g
a->f (); / / undefined behavior, a’s type not a base of B
}
—end example ]

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


Эксперт
****


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

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



xvr, т.е. получается, что таблица виртуальных методов обновляется прямо перед входом в тело конструктора, но после инициализации всех членов класса. А в деструкторе с точностью до наоборот - после выхода из тела деструктора восстанавливается таблица класса предка. Правильно ли я понял?
PM   Вверх
mes
Дата 19.6.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(bsa @  19.6.2008,  21:04 Найти цитируемый пост)
xvr, т.е. получается, что таблица виртуальных методов обновляется прямо перед входом в тело конструктора, но после инициализации всех членов класса. А в деструкторе с точностью до наоборот - после выхода из тела деструктора восстанавливается таблица класса предка. Правильно ли я понял? 

что то я запутался, но нижеприведенный пример  выдает А:f1() A::f2() , что на мой взгляд не соотвествует написанному.. прошу пояснения 
Код

#include <cstdlib>
#include <iostream>

class A
{
    public:
        A() { f1(); }
        virtual ~A() { f2(); }

        virtual void f1() { std::cout << "A::f1()" << std::endl; };
        virtual void f2() { std::cout << "A::f2()" << std::endl; };
};
class A1: public A
{
    public:
        A1() {  }
       ~A1() {  }
        virtual void f1() { std::cout << "A1::f1()" << std::endl; };
        virtual void f2() { std::cout << "A1::f2()" << std::endl; };

};


int main()
{
    A1* pa = new A1();
    delete pa;

   system("pause");
    return 0;
}



Добавлено через 1 минуту и 43 секунды
а вобше разве это не UB ?


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


Эксперт
****


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

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



mes, в том то и дело, что соответствует. Когда выполняется конструктор класса A, класс A1 еще не сконструировался и таблица виртуальных методов содержит указатели на методы класса А, который уже начал конструироваться, когда дело доходит до деструктора класса А, то класс А1 полностью деинициализировался и восстановил указатели на виртуальные методы класса А (ну или деструктор класса А это сделал перед входом в тело).
PM   Вверх
xvr
Дата 20.6.2008, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(bsa @ 19.6.2008,  21:04)
xvr, т.е. получается, что таблица виртуальных методов обновляется прямо перед входом в тело конструктора, но после инициализации всех членов класса. А в деструкторе с точностью до наоборот - после выхода из тела деструктора восстанавливается таблица класса предка. Правильно ли я понял?

Да. (Хотя технически таблицу виртуальных методов в деструкторе восстанавливает сам деструктор при входе, а не наследник при выходе, впрочем результат одинаковый)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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