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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Известно public и private, а что такое: virtual и protected, кто объяснит? 
V
    Опции темы
Pilligrim
  Дата 31.7.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile 
VC++ у меня довольно давно(пишу на нем уже где-то 1,5 года), читал много книг по С++, в частности великого Бьярна Страустрапа(кстати всем советую), давно знаю и успешно применяю(даже слишком везде) классы, соответственно знаю ключевые слова public и private, но вот как-то раз натолкнулся на такие ключевые слова как virtual и protected и словил себя на мысли что я даже не знаю что это такое. Объясните кто-нить плиз что это такое?! 
PM MAIL   Вверх
MaxWave
Дата 31.7.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не знаешь виртуал??? Разве Страус об этом не рассказывает??? Странно, значит плохо читал. 
virtual - ключ. слово перед определением функции в классе. Оно означает, что данная функция является виртуальной и должна унаследоваться производными классами. Они определяют как бы общий интерфейс производных классов,т.е. в производных классах эта ф-я переопределяется. Очень удобно использовать при созднании иерархии классов. А вообще почитай г. Шилдта - там все понятно описано. Использование широко - ищи в нете, сразу найдешь. 
PM MAIL   Вверх
vinter
Дата 31.7.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Данные обьявленные как protected можно юзать в производных классах
Цитата

А вообще почитай г. Шилдта - там все понятно описано

Полностью согласен smile  


--------------------
Мой блог
PM MAIL WWW   Вверх
Pilligrim
Дата 31.7.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо Вам. Я всё понял. smile  
PM MAIL   Вверх
Rockie
Дата 31.7.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



Pilligrim, ты имеешь ввиду virtual и protected внутри класса, или при наследовании от виртуального класса?

если у нас иерархия 

   A
  / \
 B  C
  \ /
   D

и в классе A у нас, например 

Код
class A{
public:
int a;
//..
};

то при обращении объекта класса D к этому a будет ошибка, так как объект d как бы содержит 2 копии a: от класса B, и от C:
Код
main(){
D d;
cout<<d.a; //error
}


чтобы этого не происходило, используется наследование от виртуального базового класса, с использованием virtual:
Код
class B: public virtual A{
//..
};
class C: public virtual A{
//..
};


модификатор protected в наследовании означает, что данные, определенные в родительском классе, как public, в классе-потомке станут protected 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Exception
Дата 31.7.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Главное применение ключевого слова virtual - обозначить, что метод может быть переопределён:
Код
class Vehicle
{
  public virtual void Go()
  { std::cout << "Vehicle goes..."; }
}
class Car : public Vehicle
{
  public void Go()
  { std::cout << "Car goes..."; }
}
// ...
Vehicle veh = new Vehicle();
veh.Go(); // Vehicle goes
veh = new Car();
veh.Go(); // Car goes
  

Это сообщение отредактировал(а) Exception - 31.7.2006, 21:55
PM   Вверх
sergejzr
Дата 31.7.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Exception, всё верно, только мы не в С#  smile  


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Exception
Дата 31.7.2006, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Воистину. У вас, похоже, override нету smile . 
PM   Вверх
sergejzr
Дата 31.7.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Улавливаете разницу между virtual и "простым" определением?
(особенно смотри p2)
Код

#include <iostream.h>

class Parent
{
public:
    virtual void go1()
    {
    cout<<"Parent goes 1 "<<endl;
    }

    void go2()
    {
    cout<<"Parent goes 2"<<endl;
    } 

};

class Child:public Parent
{

public:
    void go1()
    {
    cout<<"Child goes 1 "<<endl;
    }

    void go2()
    {
    cout<<"Child goes 2 "<<endl;
    }
};

int main()
{

Parent *p1=new Parent();
Child  *c1=new Child();
Parent *p2=c1;

//Обе функции от Parent, разумеется
p1->go1(); 
p1->go2();
cout<<endl;
//Обе функции от Child, разумеется
c1->go1();
c1->go2();
cout<<endl;
//А вот тут "простые" функции будут от Parent, но virtual-ьная "знает", какой именно класс был создан с new, даже хотя p2 - указатель на Parent
p2->go1();
p2->go2();

  return 0;
}


Добавлено @ 22:04 
Вот вывод проги:

Код

Parent goes 1
Parent goes 2

Child goes 1
Child goes 2

Child goes 1
Parent goes 2
Press any key to continue
 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Exception
Дата 31.7.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот как у вас хитро smile . То есть если функция виртуальная -- она переопределяется (override в C#), а если нет -- скрывается (new в C#). Понятно, буду знать smile . 
PM   Вверх
Fighter
Дата 1.8.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MaxWave @  31.7.2006,  18:21 Найти цитируемый пост)
данная функция является виртуальной и должна унаследоваться производными классами.

Почему обязательно виртуальная унаследуется, те функции, которые в Public разделе описания они тоже унаследуются. 
PM MAIL   Вверх
sergejzr
Дата 1.8.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(Fighter @  31.7.2006,  22:25 Найти цитируемый пост)
Цитата(MaxWave @  31.7.2006,  18:21 Найти цитируемый пост)
данная функция является виртуальной и должна унаследоваться производными классами.

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


А это ещё одна особенность. если хотя бы одна функция в класса определена как =0, класс будет считаться полностью абстрактным и обьект такого класса создать нельзя. Для того чтобы получить обьект, ребёнку необходимо определить все такие фукции.

например:

Код

class A
{
virtual void go()=0;
};
class B: public A
{
 void go(){}
};
class С: public A
{

};

int main()
{
A a=new A();//Ошибка компиляции!
B b=new B();// А вот здесь всё оки
С с=new C();// И тут ошибка! С всё ещё полностью абстрактный
return 0;
}

  


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
ILAgent
Дата 1.8.2006, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Pilligrim @ 31.7.2006,  18:01)
smile 
VC++ у меня довольно давно(пишу на нем уже где-то 1,5 года), читал много книг по С++, в частности великого Бьярна Страустрапа(кстати всем советую), давно знаю и успешно применяю(даже слишком везде) классы, соответственно знаю ключевые слова public и private, но вот как-то раз натолкнулся на такие ключевые слова как virtual и protected и словил себя на мысли что я даже не знаю что это такое. Объясните кто-нить плиз что это такое?!

Удивительно ! 
Что ж ты полтора года писал тогда ?
Вобщем, тут надо читать литературу, так просто про сложный полиморфизм не расскажешь. 

Да и на форуме про это много писалось уже. 

Это сообщение отредактировал(а) ILAgent - 1.8.2006, 00:59
PM MAIL   Вверх
Rockie
Дата 1.8.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



Цитата(sergej.z @  31.7.2006,  22:03 Найти цитируемый пост)
//А вот тут "простые" функции будут от Parent, но virtual-ьная "знает", какой именно класс был создан с new, даже хотя p2 - указатель на Parent    
p2->go1();    
p2->go2();

по этой же причине виртуальный деструктор будет знать, какой объект убить
Код
Parent *p = new Child;
delete p;// при обычном деструкторе вызовется только деструктор Parent, а ведь объект то Child!




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Pilligrim
Дата 1.8.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Удивительно ! 
Что ж ты полтора года писал тогда ?


ILAgent, писал проги в которых не использовал возможность наследования классов.

Цитата
Вобщем, тут надо читать литературу, так просто про сложный полиморфизм не расскажешь.


Я уже всё понял. Мне долго объяснять не надо! Всем плизsmile
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.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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