Virtuális alap osztály programozás C és C

// program tartalmaz egy hibát, és nem fordul le
#include
osztály alap nyilvános:
int i;
>;
// d1 örökli bázis.
osztály d1. állami alap nyilvános:
int j;
>;
// d2 örökli bázis.
osztály d2. állami alap nyilvános:
int k;
>;
/ * D3 örökség d1, d2. Ez azt jelenti, hogy d3 két példányban az alap! * /
D3 osztályú. állami d1, d2 nyilvános nyilvános:
int m;
>;
int main ()
d3 d;
d.i = 10; // bizonytalanság, amelyek i.
d.j = 20;
d.k = 30;
d.m = 40;
// a bizonytalanságot, amely i.
cout < cout < cout < vissza 0;
>

Kétféle módon rögzíteni a programban. Az első az, hogy az a kör operátort az i változó ezt követő manuális kiválasztás egyik az i. Például a következő verziója a program fordítása és kivégezték, szükség szerint:

#include
osztály alap nyilvános:
int i;
>;
// d1 örökli bázis.
osztály d1. állami alap nyilvános:
int j;
>;
// d2 örökli bázis.
osztály d2. állami alap nyilvános:
int k;
>;
/ * D3 örökség d1, d2. Ez azt jelenti, hogy d3 két példányban az alap! * /
D3 osztályú. állami d1, d2 nyilvános nyilvános:
int m;
>;
int main ()
d3 d;
d.d2 :: i = 10; // oltalmi kört, én használt a D2
d.j = 20;
d.k = 30;
d.m = 40;
// oltalmi kört, én használt a D2
cout < cout < cout < vissza 0;
>

Mint látható a kimutatás hatályát. programot manuálisan kiválasztott változat a d2 osztályú bázis. Ez a megoldás azonban okot ad egy mélyebb kérdést: mi van, ha csak akkor kell egy példányt az osztály bázis? Van-e bármilyen módon, hogy megakadályozzák, többek között a chenie két példányban osztály d3? Mint azt sejteni lehet, a válasz erre a kérdésre: igen. Az oldatot úgy állítjuk elő, a virtuális alap osztály.

Ha két vagy több osztály keletkezik egy közös alap osztály is predot-kapuk felvétele több példányban az alap osztály a gyermek objektum ezen osztályok által Ad-ment virtuális alap osztály annak örökségét. Például itt van egy másik változata a korábbi program, amely tartalmazza a d3 csak egy példányt az osztály alap:

#include
osztály alap nyilvános:
int i;
>;
// d1 örökli a bázis, mint egy virtuális
osztály d1. virtuális nyilvános alap nyilvános:
int j;
>;
// d2 örökli a bázis, mint egy virtuális
osztály d2. virtuális nyilvános alap nyilvános:
int k;
>;
/ * D3 örökség D1 és D2. Mindazonáltal d3, csak egy másolatot az alap! * /
D3 osztályú. állami d1, d2 nyilvános nyilvános:
int m;
>;
int main ()
d3 d;
d.i = 10; // nincs több bizonytalanság
d.j = 20;
d.k = 30;
d.m = 40;
cout < cout < cout < vissza 0;
>

Amint látható, a virtuális kulcsszót megelőzi egy származtatott osztály specifikáció. Nos, mindkét osztály D1 és D2 öröklik a szülő osztály virtuális. Bármilyen többszörös öröklés való részvételével generál most felvételét csak egy példányt az osztály bázis. Ezért az osztályban d3
csak egy példányát az osztály a bázis, ezért d.i = 10 már nem egyértelmű NYM kifejezést.

Meg kell jegyezni, egy másik tény: bár mindkét osztálya D1 és D2 alkalmazunk virtuális alap osztály, mégis minden objektum osztály d1 és d2 tartalmaz egy alap. Például, a következő kód teljesen korrekt:

// osztály definíciója a típus d1
d1 MyClass;
myclass.i = 100;

Hagyományos és virtuális alap osztályok különböznek egymástól csak akkor, ha bármilyen tárgy örökli az alap osztály egynél többször. Ha a virtuális alap osztály csak egy példányát az alap osztály tartalmazza az objektumot. Abban az esetben, szokásos bázis osztály az objektum tartalmazhat több példányban.