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

bookPuhdas Virtuaalimenetelmä

Käsite virtuaalimenetelmistä 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 nollaksi. Tämä osoittaa, että funktiolla ei ole toteutusta kyseisessä class-luokassa ja se täytyy korvata jokaisessa aliluokassa ennen kuin kyseisen class-luokan olioita voidaan luoda.

virtual.h

virtual.h

copy
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 luokasta class, jossa se määritellään, abstraktin, eli kyseisen luokan olioiden luominen on mahdotonta. Tämä rajoitus on olemassa, koska jokainen class-sisällä oleva menetelmä täytyy toteuttaa ennen ilmentymän luomista ja käyttämistä, jotta virheet ja ennalta-arvaamaton toiminta voidaan estää. Katso alla olevaa koodia:

Animal.h

Animal.h

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

Animal class sisältää puhdas virtuaalinen metodi nimeltä speak(), joka estää olioiden luomisen tästä luokasta. Tämä rakenne on looginen, sillä virtuaalisen metodin tarkoitus on edustaa kunkin eläimen tunnusomaista ääntä.

Tekemällä metodista virtuaalinen, se mahdollistaa, että jokainen aliluokka toteuttaa oman versionsa, tuoden esiin kunkin eläimen äänen yksilöllisyyden. Määrittely puhtaaksi virtuaaliseksi osoittaa, ettei oletustoteutusta ole olemassa, korostaen konkreettisten toteutusten tarvetta johdetuissa luokissa.

main.cpp

main.cpp

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

Tämäkin on perusteltua. Animal class-ilmentymien luominen olisi epäkäytännöllistä ja epäloogista, sillä se edustaa abstraktia käsitettä, joka toimii eri eläinten luokkana. Yleisellä eläimellä ei ole tiettyä käyttäytymistä, mikä vahvistaa class abstraktia luonnetta ja korostaa tarvetta luoda erikoistuneita aliluokkia, jotka kuvaavat kunkin eläimen yksilölliset äänet.

main.cpp

main.cpp

copy
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 Animal-tyyppistä oliota suoraan, sitä voidaan silti käyttää funktion parametrina. Samoin kuin aiemmassa painike-esimerkissä, tämä lähestymistapa hyödyntää polymorfismia monipuolisen ohjelman luomiseen, joka voi muuttaa käyttäytymistään dynaamisesti ajonaikana.

Note
Huomio

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

question mark

Mitä tapahtuu, kun luokassa on puhdas virtuaalimenetelmä?

Select the correct answer

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

bookPuhdas Virtuaalimenetelmä

Pyyhkäise näyttääksesi valikon

Käsite virtuaalimenetelmistä 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 nollaksi. Tämä osoittaa, että funktiolla ei ole toteutusta kyseisessä class-luokassa ja se täytyy korvata jokaisessa aliluokassa ennen kuin kyseisen class-luokan olioita voidaan luoda.

virtual.h

virtual.h

copy
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 luokasta class, jossa se määritellään, abstraktin, eli kyseisen luokan olioiden luominen on mahdotonta. Tämä rajoitus on olemassa, koska jokainen class-sisällä oleva menetelmä täytyy toteuttaa ennen ilmentymän luomista ja käyttämistä, jotta virheet ja ennalta-arvaamaton toiminta voidaan estää. Katso alla olevaa koodia:

Animal.h

Animal.h

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

Animal class sisältää puhdas virtuaalinen metodi nimeltä speak(), joka estää olioiden luomisen tästä luokasta. Tämä rakenne on looginen, sillä virtuaalisen metodin tarkoitus on edustaa kunkin eläimen tunnusomaista ääntä.

Tekemällä metodista virtuaalinen, se mahdollistaa, että jokainen aliluokka toteuttaa oman versionsa, tuoden esiin kunkin eläimen äänen yksilöllisyyden. Määrittely puhtaaksi virtuaaliseksi osoittaa, ettei oletustoteutusta ole olemassa, korostaen konkreettisten toteutusten tarvetta johdetuissa luokissa.

main.cpp

main.cpp

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

Tämäkin on perusteltua. Animal class-ilmentymien luominen olisi epäkäytännöllistä ja epäloogista, sillä se edustaa abstraktia käsitettä, joka toimii eri eläinten luokkana. Yleisellä eläimellä ei ole tiettyä käyttäytymistä, mikä vahvistaa class abstraktia luonnetta ja korostaa tarvetta luoda erikoistuneita aliluokkia, jotka kuvaavat kunkin eläimen yksilölliset äänet.

main.cpp

main.cpp

copy
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 Animal-tyyppistä oliota suoraan, sitä voidaan silti käyttää funktion parametrina. Samoin kuin aiemmassa painike-esimerkissä, tämä lähestymistapa hyödyntää polymorfismia monipuolisen ohjelman luomiseen, joka voi muuttaa käyttäytymistään dynaamisesti ajonaikana.

Note
Huomio

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

question mark

Mitä tapahtuu, kun luokassa on puhdas virtuaalimenetelmä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 3
some-alt