logo

Ц++ виртуелна функција

  • Ц++ виртуелна функција је функција члана у основној класи коју редефинишете у изведеној класи. Декларише се помоћу виртуелне кључне речи.
  • Користи се да каже компајлеру да изврши динамичко повезивање или касно везивање функције.
  • Постоји потреба да се користи један показивач за упућивање на све објекте различитих класа. Дакле, креирамо показивач на основну класу која се односи на све изведене објекте. Али, када показивач основне класе садржи адресу објекта изведене класе, увек извршава функцију основне класе. Овај проблем се може решити само коришћењем 'виртуелне' функције.
  • 'Виртуелно' је кључна реч која претходи нормалној декларацији функције.
  • Када се функција учини виртуелном, Ц++ одређује која функција треба да се позове у току извршавања на основу типа објекта на који указује показивач основне класе.

Касно везивање или динамичко повезивање

У касном повезивању позив функције се решава током времена извршавања. Због тога компајлер одређује тип објекта у време извођења, а затим повезује позив функције.


Правила виртуелне функције

прост број јава
  • Виртуелне функције морају бити чланови неке класе.
  • Виртуелне функције не могу бити статички чланови.
  • Приступа им се преко показивача објеката.
  • Они могу бити пријатељи друге класе.
  • Виртуелна функција мора бити дефинисана у основној класи, иако се не користи.
  • Прототипови виртуелне функције основне класе и свих изведених класа морају бити идентични. Ако две функције са истим именом, али различитим прототиповима, Ц++ ће их сматрати преоптерећеним функцијама.
  • Не можемо имати виртуелни конструктор, али можемо имати виртуелни деструктор
  • Размотрите ситуацију када не користимо виртуелну кључну реч.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>

Излаз:

 Value of x is : 5 

У горњем примеру, * а је показивач основне класе. Показивач може приступити само члановима основне класе, али не и члановима изведене класе. Иако Ц++ дозвољава основном показивачу да указује на било који објекат изведен из основне класе, он не може директно приступити члановима изведене класе. Због тога постоји потреба за виртуелном функцијом која омогућава основном показивачу да приступи члановима изведене класе.

Пример виртуелне функције Ц++

Хајде да видимо једноставан пример Ц++ виртуелне функције која се користи за позивање изведене класе у програму.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>

Излаз:

 Derived Class is invoked 

Чиста виртуелна функција

  • Виртуелна функција се не користи за обављање било ког задатка. Служи само као чувар места.
  • Када функција нема дефиницију, таква функција је позната као ' не ради ништа ' функција.
  • ' не ради ништа ' функција је позната као а чиста виртуелна функција . Чиста виртуелна функција је функција декларисана у основној класи која нема дефиницију у односу на основну класу.
  • Класа која садржи чисту виртуелну функцију не може се користити за декларисање сопствених објеката, такве класе су познате као апстрактне основне класе.
  • Главни циљ основне класе је да обезбеди карактеристике изведеним класама и да креира основни показивач који се користи за постизање полиморфизма времена извршавања.

Чиста виртуелна функција се може дефинисати као:

 virtual void display() = 0; 

Погледајмо једноставан пример:

тостринг у јава
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>

У горњем примеру, основна класа садржи чисту виртуелну функцију. Према томе, основна класа је апстрактна основна класа. Не можемо да креирамо објекат основне класе.