Ïðè
êîìïèëàöèÿ è èçïúëíåíèå ñå ïîëó÷àâà ñëåäíîòî:
Invokation by a ZooAnimal
object:
ZooAnimal name: circusZooAnimal
Invokation by a Bear object:
ZooAnimal
name: cartoon Bear
scientific name: ursus cartoonus Zoo
Area
Location:NorthWest:
B1: area BroWn
Invokation by a Panda object:
ZooAnimal
name: Giant Panda
scientific name: Ailuropoda
Melaoleucawe
call our friend: Yin YangZoo
Area Location:NorthWest:
B1.P:
area BrownSpotsRoom Location: 1001
Ñëåäâàùèÿò ïðèìåð ïîêàçâà
ðàáîòà äèðåêòíî ñ óêàçàòåëè êúì îáåêòè. Òîé âèêà âèðòóàëíàòà ôóíêöèÿ
isA().
#include <stream.h>
#include "ZooANimal.h"
#include
"Bear.h"
#include "Panda.h"
ZooAnimal circus( "circusZooAnimal"
);
Bear yogi("cartoon Bear", BEAR, "ursus cartoonus");
Panda yinYang("Yin
Yang", 1001, "Giant Panda");
main() {
ZooAnimal *pz;
pz =
&circus;
cout << "virtual: ZooAnimal::isA():n";
pz->isA(
cout );
pz = &yogi;cout << "nvirtual:
Bear::isA():n";
pz->isA( cout );pz = &yinYang;
cout <<
"nvirtual: Panda::isA():n";
pz->isA( cout );
}
Ïðè êîìïèëàöèÿ
è èçïúëíåíèå ñå ïîëó÷àâà ñëåäíîòî:
virtual:
ZooAnimal::isA():
ZooAnimal name: circusZooAnimal
virtual:
Bear::isA():
ZooAnimal name: cartoon Bear
scientific name: ursus
cartoonus
virtual: Panda::isA():
ZooAnimal name: Giant Panda
scientific
name: Ailuropoda Melaoleuca
we call our friend: Yin Yang
 ñëåäâàùèÿ
ïðèìåð äåéñòâèòåëíèÿò òèï íà êëàñà, àäðåñèðàí ÷ðåç pz ñå ðàçïîçíàâà ïî âðåìå íà
êîìïèëàöèÿ. Íåêà îñòàâèì âèðòóàëíèÿ ìåõàíèçúì è äà èçâèêàìå âñÿêà ôóíêöèÿ
ñòàòè÷íî:
#include <stream.h>
#include "ZooAnimal.h"
#include
"Bear.h"
#include "Panda.h"
ZooAnimal circus(
"circusZooAnimal");
Bear yogi("cartoon Bear", BEAR, "ursus
cartoonus");
Panda yinYang("Yin Yang", 1001, "Giant Panda");
main()
{
ZooAnimal *pz = &yinYang;
cout << "Nonvirtual invokation of
Panda::isA():n";
((Panda*)pz) ->Panda::isA( cout );
pz =
&yogi;
cout << "nNonvirtual invokation of
Bear::isA():n";
((Bear*)pz) ->Bear::isA( cout );
}
Íå
âèðòóàëíîòî èçâèêâàíå íà Panda::isA() ÷ðåç óêàçàòåë êúì ZooAnimal èçèñêâà ÿâíî
îáðúùåíèå. ZooAnimal íÿìà ïðåäñòàâà çà ñëåäâàùèòå èçâëè÷àíèÿ îò êëàñà Panda;
òîâà å ÷àñò îò âèðòóàëíèÿ ìåõàíèçúì, à íå ÷àñò îò ñàìèÿ áàçîâ êëàñ. Ïðè
êîìïèëàöèÿ è èçïúëíåíèå ñå ïîëó÷àâà ñëåäíîòî:
Nonvirtual invocation of
Panda::isA():
ZooAnimal name: Giant Panda
scientific name: Ailoropoda
Melaoleucawe
call our friend: Yin Yang
Nonvirtual invocation of
Bear::isA():
ZooAnimal name: cartoon Bear
scientific name: ursuss
cartoonus
Òîçè ïîñëåäåí ïðèìåð îòïå÷àòâà ñìåñåí ñïèñúê îò óêàçàòåëè êúì
ZooAnimal. Òîé å ðåàëèçèðàí ñ èçïîëçâàíåòî íà ñëåäíàòà íå ÷ëåí ôóíêöèÿ print() -
print() òðÿáâà äà èìà äîñòúï äî ÷ëåíîâåòå äàííè íà ZooAnimal, êîèòî íå ñà
public, çàòîâà òðÿáâà äà áúäå îáÿâåíà êàòî friend çà ZooAnimal.
#include
<iostream.h>
#include "ZooAnimal.h"
void print( ZooAnimal *pz,
ostream &os = cout ) {
while( pz )
{
pz->print( os );
os
<< "n";
pz = pz->next;
}
Çà íàøèÿ ïðîãðàìåí ïðèìåð èìàìå
íóæäà îò óêàçàòåë êúì ZooAnimal, êîéòî äà ñëóæè êàòî ãëàâà íà ñâúðçàíèÿ
ñïèñúê:
ZooAnimal *headPptr = 0;
main() äåôèíèðàìå ïî ñëåäíèÿ
íà÷èí:
#include <stream.h>
#include "ZooAnimal.h"
extern
ZooAnimal makeList( ZooAnimal );
ZooAnimal *headPtr = 0;
main()
{
cout << "A Program to Illustrate Virtual Functionsn";
headPtr =
makeList( headPtr );
print( headPtr );
}
makeList(), íà ñâîé ðåä, å
äåôèíèðàíà ïî ñëåäíèÿ íà÷èí:
#include <stream.h>
#include
"ZooAnimal.h"
#include "Bear.h"
#include "Panda.h"
ZooAnimal
circus( "circusZooAnimal" );
Bear yogi("cartoon Bear",BEAR,"ursus
cartoonus");
Panda yinYang("Yin Yang",1001,"Giant Panda");
Panda
rocky("Rocky",943,"Red Panda","Ailurus fulgens");
ZooAnimal *makeList(
ZooAnimal *ptr )
{// for simplicity, hand code list
ptr =
&yinYang;ptr->link( &circus );
ptr->link( &yogi
);
ptr->link( &rocky );
return ptr;
}