Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Puhdas virtuaalimenetelmä | Polymorfismin Yleiskatsaus
C++ OOP

Puhdas virtuaalimenetelmä

Pyyhkäise näyttääksesi valikon

Virtuaalimenetelmien käsite on keskeinen polymorfismin saavuttamisessa, mahdollistaen joustavan ja laajennettavan ohjelmistosuunnittelun. Puhtaat virtuaalimenetelmät laajentavat tätä määrittelemällä rajapintoja ja tukemalla dynaamista sidontaa.

Puhtaan virtuaalimenetelmän syntaksi

Puhtaan virtuaalimenetelmän määrittelyssä käytetään virtual-avainsanaa ja alustetaan nollaan. Tämä ilmaisee, että funktiolla ei ole määritelmää kyseisessä class:ssa ja se on ylikirjoitettava jokaisessa aliluokassa ennen kuin kyseisen class:n olioita voidaan luoda.

virtual.h

virtual.h

1
virtual void example() = 0;

Tämä menetelmä toimii samalla tavalla kuin tavallinen menetelmä, paitsi että sillä ei ole runkoa sulkujen { } sisällä, vaan se päätetään = 0;, mikä osoittaa, ettei toteutusta ole. Muut säännöt tälle menetelmälle ovat samat kuin tavallisille menetelmille.

Puhtaan virtuaalisen menetelmän määrittely tekee siitä class:sta, jossa se määritellään, abstraktin, eli kyseisen class-luokan olioiden luominen ei ole mahdollista. Tämä rajoitus on olemassa, koska jokainen luokan menetelmä täytyy toteuttaa ennen olion luomista ja käyttämistä, jotta virheet ja ennalta-arvaamaton toiminta voidaan estää. Katso alla olevaa koodia:

Animal.h

Animal.h

1234
class Animal { public: virtual void speak() = 0; };

Animal class sisältää puhdas virtuaalinen metodi nimeltään speak(), mikä estää olioiden luomisen tästä luokasta. Tämä rakenne on looginen, sillä virtuaalisen metodin tarkoituksena on kuvata kunkin eläimen tunnusomaisia ääniä.

Määrittämällä metodi virtuaaliseksi, jokainen aliluokka voi toteuttaa oman versionsa, mikä tuo esiin kunkin eläimen yksilöllisen äänen. Kun metodi määritellään puhtaaksi virtuaaliseksi, osoitetaan, ettei oletustoteutusta ole olemassa, korostaen konkreettisten toteutusten tarvetta perityissä luokissa.

main.cpp

main.cpp

1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Tämäkin on järkevää. Animal class-luokan ilmentymien luominen olisi epäkäytännöllistä ja epäloogista, sillä se edustaa abstraktia käsitettä, joka toimii eri eläinten kategoriana. Yleisellä eläimellä ei ole tiettyä käyttäytymistä, mikä vahvistaa class abstraktia luonnetta ja korostaa tarvetta luoda erikoistuneita aliluokkia kuvaamaan kunkin eläimen ainutlaatuisia ääniä.

main.cpp

main.cpp

12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Vaikka ei ole mahdollista luoda oliota tyyppiä Animal suoraan, sitä voidaan silti käyttää parametrina funktiossa. Samoin kuin aiemmassa button-esimerkissä, tämä lähestymistapa hyödyntää polymorfismia monipuolisen ohjelman rakentamiseen, joka voi muuttaa käyttäytymistään dynaamisesti ajonaikaisesti.

Note
Huomio

Kokeile välittää funktiolle eri class-olio ja tarkkaile tulostetta. Yritä myös luoda abstraktin class-olio nähdäksesi, kuinka kääntäjä estää olion luonnin toteuttamattomien puhtaiden virtuaalimetodien vuoksi.

question mark

Mitä tapahtuu, kun luokassa on puhdas virtuaalimenetelmä?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 5. Luku 3
some-alt