Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Известно public и private, а что такое:


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

Автор: MaxWave 31.7.2006, 18:21
Не знаешь виртуал??? Разве Страус об этом не рассказывает??? Странно, значит плохо читал. 
virtual - ключ. слово перед определением функции в классе. Оно означает, что данная функция является виртуальной и должна унаследоваться производными классами. Они определяют как бы общий интерфейс производных классов,т.е. в производных классах эта ф-я переопределяется. Очень удобно использовать при созднании иерархии классов. А вообще почитай г. Шилдта - там все понятно описано. Использование широко - ищи в нете, сразу найдешь. 

Автор: vinter 31.7.2006, 18:24
Данные обьявленные как protected можно юзать в производных классах
Цитата

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

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

Автор: Pilligrim 31.7.2006, 18:29
Спасибо Вам. Я всё понял. smile  

Автор: Rockie 31.7.2006, 21:40
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 

Автор: Exception 31.7.2006, 21:50
Главное применение ключевого слова 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
  

Автор: sergejzr 31.7.2006, 21:54
Exception, всё верно, только мы не в С#  smile  

Автор: Exception 31.7.2006, 21:56
Воистину. У вас, похоже, override нету smile . 

Автор: sergejzr 31.7.2006, 22:03
Улавливаете разницу между 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
 

Автор: Exception 31.7.2006, 22:21
Вот как у вас хитро smile . То есть если функция виртуальная -- она переопределяется (override в C#), а если нет -- скрывается (new в C#). Понятно, буду знать smile . 

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

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

Автор: sergejzr 1.8.2006, 00:36
Цитата(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;
}

  

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

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

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

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

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


Автор: Pilligrim 1.8.2006, 19:06
Цитата
Удивительно ! 
Что ж ты полтора года писал тогда ?


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

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


Я уже всё понял. Мне долго объяснять не надо! Всем плизsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)