Kurssisisältö
C++ OOP
C++ OOP
Puhdas Virtuaalimenetelmä
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 se alustetaan nollaan. Tämä osoittaa, että funktiolla ei ole toteutusta kyseisessä class
:ssa ja se on ylikirjoitettava kaikissa aliluokissa ennen kuin kyseisen class
:n olioita voidaan luoda.
virtual.h
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 virtuaalimenetelmän määrittely tekee class
-luokan, jossa se on määritelty, abstraktiksi, mikä tarkoittaa, että tämän luokan olioiden luominen on mahdotonta. Tämä rajoitus on olemassa, koska jokainen class
-luokan menetelmä täytyy toteuttaa ennen olion luomista ja käyttämistä, jotta virheet ja arvaamaton käyttäytyminen voidaan estää. Katso alla olevaa koodia:
Animal.h
class Animal { public: virtual void speak() = 0; };
Animal
class
-luokassa on puhdas virtuaalinen metodi nimeltä speak()
, mikä estää olioiden luomisen tästä luokasta. Tämä rakenne on järkevä, sillä virtuaalisen metodin tarkoituksena on edustaa kunkin eläimen tunnusomaista ääntä.
Tekemällä metodista virtuaalinen mahdollistetaan, että jokainen aliluokka voi toteuttaa oman versionsa, jolloin eläimen äänen yksilöllisyys tulee esiin. Kun metodi määritellään puhtaaksi virtuaaliseksi, osoitetaan, ettei oletustoteutusta ole olemassa, ja korostetaan konkreettisten toteutusten tarvetta perityissä luokissa.
main.cpp
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Tämäkin on loogista. Instanssien luominen Animal
class
-luokasta 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 erikoistuneiden aliluokkien merkitystä kunkin eläimen yksilöllisten äänien kuvaamisessa.
main.cpp
#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 tyypiltään Animal
suoraan, voimme silti käyttää sitä funktion parametrina. Samoin kuin aiemmassa button-esimerkissä, tämä lähestymistapa hyödyntää polymorfismia luodakseen monipuolisen ohjelman, joka voi dynaamisesti muuttaa käyttäytymistään ajonaikaisesti.
Kokeile välittää funktion parametriksi eri class
-luokan olio ja tarkkaile tulostetta. Yritä myös luoda abstraktin class
-luokan olio ja huomaa, kuinka kääntäjä estää olion luonnin toteuttamattomien puhtaiden virtuaalimetodien vuoksi.
Kiitos palautteestasi!