Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему не происходит вызов виртульной функции ? / 20 сообщений из 20, страница 1 из 1
14.03.2015, 17:42
    #38904920
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
class TElmtBase
{
	protected:
	    virtual void InitDBComponent( ) = 0;

	public:

	void invoke()
	{
	      InitDBComponent(  );
	}

	TElmtBase( )
	{
		InitDBComponent( );
	}
};

class TUserList : public TElmtBase
{
	typedef TElmtBase Inherited;

	protected:
		void InitDBComponent( )
		{
			ShowMessage( "10000");
		}

	public:
	  TUserList() : Inherited(  )
	  {
		 // invoke();
	  }
};


   TElmtBase *UserList = new TUserList;

// Или

    TUserList *UserList = new TUserList;

// И так и сяк пробовал



при вызове функции invoke(); все работает. делал по аналогии с Delphi. Там работает без invoke();, а в С++ нет.
Почему так ?
...
Рейтинг: 0 / 0
14.03.2015, 17:44
    #38904921
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323,

Почему функцию InitDBComponent( ); нельзя вызвать в базовом классе в конструкторе, что бы она была вызвана в производном ?
...
Рейтинг: 0 / 0
14.03.2015, 17:50
    #38904924
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
а кто разрешил вызывать виртуальную функцию в конструкторе базового класса?
...
Рейтинг: 0 / 0
14.03.2015, 17:56
    #38904925
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Изопропил,

Ну я по аналогии Delphi делал.

type
TElmtBase = class

protected
procedure InitDBComponent; abstract; virtual;
public
constructor Create;
end;

constructor TElmtBase.Create;
begin
InitDBComponent;
end;

type
TUserList = class( TElmtBase )

protected
procedure InitDBComponent; override;

end;

procedure TUserList.InitDBComponent;
begin

end;
...
Рейтинг: 0 / 0
14.03.2015, 17:56
    #38904926
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323,

блиин. код в теги не заключил
...
Рейтинг: 0 / 0
14.03.2015, 18:00
    #38904927
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323блиин. код в теги не заключил
это не беда, в отличие от вызова виртуальной функции из конструктора
gera3323Ну я по аналогии Delphi делал.
забудьте аналогии
...
Рейтинг: 0 / 0
14.03.2015, 18:11
    #38904931
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Изопропил,

хорошо, забуду. приведите правильный пример вызова, если это не сложно
...
Рейтинг: 0 / 0
14.03.2015, 18:22
    #38904934
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323при вызове функции invoke(); все работает.
вот собственно и решение
...
Рейтинг: 0 / 0
14.03.2015, 18:23
    #38904935
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Изопропил,

понятно. а почему так сделано, что нельзя осуществлять вызов из конструктора ?
...
Рейтинг: 0 / 0
14.03.2015, 18:40
    #38904943
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323Изопропил,

понятно. а почему так сделано, что нельзя осуществлять вызов из конструктора ?
чтоб не вызывать метод ещё не сконструированного объекта
...
Рейтинг: 0 / 0
14.03.2015, 19:46
    #38904957
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Изопропил,

спасибо
...
Рейтинг: 0 / 0
15.03.2015, 04:07
    #38905048
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323gera3323,

Почему функцию InitDBComponent( ); нельзя вызвать в базовом классе в конструкторе, что бы она была вызвана в производном ?

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

правда, боюсь тебе это не понравится.
...
Рейтинг: 0 / 0
15.03.2015, 04:08
    #38905049
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323Изопропил,

хорошо, забуду. приведите правильный пример вызова, если это не сложно

у тебя нет ничего неправильного.
...
Рейтинг: 0 / 0
15.03.2015, 04:11
    #38905050
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
gera3323Изопропил,

понятно. а почему так сделано, что нельзя осуществлять вызов из конструктора ?

можно вызывать. виртуальную функцию можно откуда угодно вызывать, кроме статистических методов.
...
Рейтинг: 0 / 0
15.03.2015, 09:06
    #38905064
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
paragraph 10.4/6 of the C++11 Standard:
Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined.
вот такая беда правда есть
...
Рейтинг: 0 / 0
15.03.2015, 09:17
    #38905069
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Изопропил,

ну вызвать то можно... :-)
...
Рейтинг: 0 / 0
15.03.2015, 09:28
    #38905073
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
MasterZivИзопропил,

ну вызвать то можно... :-)
но мы ведь стремимся получать предсказуемые результаты :)
...
Рейтинг: 0 / 0
15.03.2015, 12:38
    #38905164
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Изопропил,

Можно определить pure virtual function с пустым телом, и результат будет предсказуем.
...
Рейтинг: 0 / 0
15.03.2015, 13:08
    #38905179
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
MasterZivpure virtual function с пустым телом
?
...
Рейтинг: 0 / 0
15.03.2015, 13:34
    #38905192
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не происходит вызов виртульной функции ?
Изопропилно мы ведь стремимся получать предсказуемые результаты :)pure virtual function call вполне себе предсказуемый результат
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему не происходит вызов виртульной функции ? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]