Что означает virtual при объявлении функции внутри класса?
Как я понимаю, при помощи слова virtual обеспечивается полиморфизм--способность программы во время своего исполнения определять, как какому классу относится функция с определённым именем.
Но хотелось бы узнать поподробнее об этом ключевом слове.
Чем отличается конструкция
class MyClass1
{
// данные класса MyClass1;
MyClass1(); // конструктор
~MyClass1(); // деструкторint MyFunc1(int a, inb b);
// прочие методы класса MyCLass1;
};
class MyClass2 : public MyClass1
{
// данные класса MyCLass2;
MyClass2(); // конструктор
~MyClass2(); // деструктор;int MyFunc1(int a, int b);
// прочие методы класса MyClass2;
};
от конструкции
class MyClass1
{
// данные класса MyClass1;
MyClass1(); // конструктор
~MyClass1(); // деструкторvirtual int MyFunc1(int a, inb b);
// прочие методы класса MyCLass1;
};
class MyClass2 : public MyClass1
{
// данные класса MyCLass2;
MyClass2(); // конструктор
~MyClass2(); // деструктор;virtual int MyFunc1(int a, int b);
// прочие методы класса MyClass2;
};
?
1613 г. = 2024 г.
Re: Что означает virtual при объявлении функции внутри класса?
Здравствуйте, RussianFellow, Вы писали:
RF>Что означает virtual при объявлении функции внутри класса? RF>Как я понимаю, при помощи слова virtual обеспечивается полиморфизм--способность программы во время своего исполнения определять, как какому классу относится функция с определённым именем.
Здравствуйте, Pavel Dvorkin, Вы писали:
RF>>Что означает virtual при объявлении функции внутри класса?
PD>Означает необходимость изучения языка прежде, чем приступать к написанию кода.
Я так понимаю, товарищ, после долгих лет в политике и прочих подобных форумах, решил на C++ список развернуть
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Означает необходимость изучения языка прежде, чем приступать к написанию кода.
Первый не выдержал
Сам хотел что-то подобное ответить… но вспомнил себя в далеком 96-97ом со Сваном в обнимку, и подобрел
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Я понимаю, но всему предел есть.
+100500
Этот товарищ, что спрашивал насчёт virtual, захламил и затроллил всё по MFC и WINAPI.
А теперь пытается добиться, чтобы здесь ему устроили бесплатные курсы ликбеза по программированию
Re[4]: Что означает virtual при объявлении функции внутри класса?
Здравствуйте, Pavel Dvorkin, Вы писали: PD>Здравствуйте, Carc, Вы писали: C>>Сам хотел что-то подобное ответить… но вспомнил себя в далеком 96-97ом со Сваном в обнимку, и подобрел PD>Я понимаю, но всему предел есть. PD>Вот сюда посмотри. PD>http://rsdn.org/forum/mfc/
Скрытый текст
Твою жешь мать...
Один плюс, раздел ожил немного
Sic luceat lux!
Re[5]: Что означает virtual при объявлении функции внутри класса?
K>Один плюс, раздел ожил немного
Жирный минус — раздел ожил за счёт детских вопросов, которые гуглятся на пол-раза.
P.S. С такими простыми вопросами — правильнее было бы начинать, например с .NET и C# — там всё это проще, нежели в MFC.
Re: Что означает virtual при объявлении функции внутри класса?
Здравствуйте, RussianFellow, Вы писали:
RF>Чем отличается конструкция
RF>
RF>class MyClass1
RF>{
RF> // данные класса MyClass1;
RF> MyClass1(); // конструктор
RF> ~MyClass1(); // деструктор
RF> int MyFunc1(int a, inb b);
RF> // прочие методы класса MyCLass1;
RF>};
RF>class MyClass2 : public MyClass1
RF>{
RF> // данные класса MyCLass2;
RF> MyClass2(); // конструктор
RF> ~MyClass2(); // деструктор;
RF> int MyFunc1(int a, int b);
RF> // прочие методы класса MyClass2;
RF>};
RF>
RF>от конструкции
RF>
RF>class MyClass1
RF>{
RF> // данные класса MyClass1;
RF> MyClass1(); // конструктор
RF> ~MyClass1(); // деструктор
RF> virtual int MyFunc1(int a, inb b);
RF> // прочие методы класса MyCLass1;
RF>};
RF>class MyClass2 : public MyClass1
RF>{
RF> // данные класса MyCLass2;
RF> MyClass2(); // конструктор
RF> ~MyClass2(); // деструктор;
RF> virtual int MyFunc1(int a, int b);
RF> // прочие методы класса MyClass2;
RF>};
RF>
RF>?
если написать
MyClass1 *m = new MyClass2; m->MyFunc1(1,2)
(Обратите внимание что слева от = указан тип MyClass1, а справа — MyClass2)
То в первой вашей конструкции у вас вызовется MyFunc1, обьявленная в классе MyClass1 (потому что тип указателя m — MyClass1, хоть и тип объекта MyClass2, но сам объект m не содержит информации о типе)
А во втором случае этот же код вызовет MyFunc1 из класса MyClass2 (теперь обьект m содержит в себе информацию о том, что его настоящий тип MyClass2, хоть сам указатель и обьявлен как MyClass1. Cлово virtual указывает компилятору, чтоб он добавил в обьект специальную таблицу указателей на функции класса MyClass2, а не руководствовался типом указателя (в нашем случае MyClass1))
Здравствуйте, Ops, Вы писали:
M>>Я так понимаю, товарищ, после долгих лет в политике и прочих подобных форумах, решил на C++ список развернуть
Ops>Зачем для этого "virtual"?
Может, он свою иерархию контейнеров делает, с корневым классом CContainer и виртуальным методом reverse
Здравствуйте, T4r4sB, Вы писали:
TB>Вот я по названию темы подумал, что будет хитрый вопрос с подвохом, возможно раскрывающий очередной баг Студии. TB>А оказалось — вопрос по букварю
А я по автору темы подумал Слегка, правда, тоже удивился нубовости вопроса, но шока не испытал
Здравствуйте, AlexGin, Вы писали:
AG>Жирный минус — раздел ожил за счёт детских вопросов, которые гуглятся на пол-раза. AG>P.S. С такими простыми вопросами — правильнее было бы начинать, например с .NET и C# — там всё это проще, нежели в MFC.