Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Вниз

С++ и Delphi по разному вызывают виртуальный метод в конструкторе   Найти похожие ветки 

 
Semin Aleksei   (2003-06-23 12:11) [0]

Имеем некий класс TMyClassA, который содержит виртуальный метод
VMethod. В конструкторе TMyClassA вызываем наш VMethod.
Теперь берем наследника от TMyClassA, пусть он будет TMyClassB.
В классе TMyClassB переписываем виртуальный метод VMethod.
А сейчас вопрос! Создадим TMyClassB. Как Вы думаете, какой код
будет выполнен в конструкторе? Код VMethod класса TMyClassA или код VMethod класса TMyClassB? Всегда думал, что второе (код класса TMyClassB), в общем, в Delphi так и есть. НО почему
в С++ все наоборот, т.е выполняется код класса TMyClassA?
PS
Данная особенность распространяется только на вызовы виртуальных
методов в конструкторе, в других случаях все работает одинаково.

Код на С++

class TMyClassA {
public:
TMyClassA()
{
VMethod();
}
virtual void VMethod()
{
printf("TMyClassA");
}
};

class TMyClassB: public TMyClassA {
public:
void VMethod()
{
printf("TMyClassB");
}
};

int main(int argc, char* argv[])
{
TMyClassB B;
return 0;
}


 
Dimka Maslov   (2003-06-23 12:23) [1]

В С++ конструктор - метод, вызываемый ДО создания таблицы виртуальных методов, а в Delphi - после. Поэтому при вызове виртуального метода в конструкторе в Delphi вызовется метод, переопределённый в потомке, а C++ - метод родительского класса. Вообще же в С++ и в Delphi реализованы различные подходы к ООП, по-


 
Dimka Maslov   (2003-06-23 12:27) [2]

особенно это проявляется в конструкторах и деструкторах объектов.
по-этому, если необходимо выполнять некие действия в момент создания объекта в С++ недо объявить виртуальный метод и вызывать его после конструктора:

TMyClassB *MyObjectB;
(MyObjectB = new TMyClassB).VMethod();
....
delete MyObjectB;


 
Semin Aleksei   (2003-06-23 12:30) [3]

Спасибо! Всегда думал, что подходы к ООП должны
быть одинаковы, особенно для таких монстров как PASCAL и C++.


 
Anatoly Podgoretsky   (2003-06-23 12:34) [4]

Почему, и кто договорится о реализации и что кроме этих двух языков других нет?


 
Dimka Maslov   (2003-06-23 12:55) [5]

На самом деле, сколько существует языков с поддержкой ООП, столько и различных подходов к его реализации, хотя основополагающие приниципы едины для всех.


 
vuk   (2003-06-23 14:26) [6]

to Dimka Maslov:
>а в Delphi - после
Угу. Точно. Особенно с учетом того, что VMT компилятором создается... :o)


 
Suntechnic   (2003-06-24 05:28) [7]

>Semin Aleksei
Да дело даже не в подходе к ООП... и VM тут абсолютно ни при чём... здесь обычная логика.
Если ты вспомнишь в какой последовательности вызываются конструкторы в С++, то ответ на вопрос данного поста будет тебе очевиден.
В С++ сначала вызывается конструтор базового класса, и только затем дочернего. А теперь представь себе имплементацию виртуального метода в дочернем классе, который оперирует полями объекта, который попросту ещё не создан и не проинициализирован (ведь конструктор дочернего класса вызовется только после того, как отработает конструктор базового класса, в котором ты как раз и вызываешь виртуальный метод).



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.017 c
14-20278
alxx
2003-06-18 15:25
2003.07.07
Как врубить двустороннюю печать у драйвера принтера?


3-19977
Леха
2003-06-12 22:50
2003.07.07
Ребята! Извините за глупый вопрос! Как в гриде в числовом поле за


14-20267
Lamer111
2003-06-19 22:45
2003.07.07
чат для локалки


14-20243
Soft
2003-06-19 18:09
2003.07.07
Уязвимость в Win2000


3-19959
RVL9
2003-06-11 20:46
2003.07.07
вопрос по картинкам в бд





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский