Wirtualne klasy podstawowej
Ponieważ klasa może być więcej niż jeden raz pośrednich klasy podstawowej w klasie pochodnej, C++ zapewnia sposób, aby zoptymalizować sposób, takie oprzeć klasy pracy.Wirtualne klasy podstawowej oferują sposób, aby zaoszczędzić miejsce i uniknąć niejasności w hierarchii klas, które używają wielokrotne dziedziczenie.
Każdy obiekt niewirtualna zawiera kopię członków danych zdefiniowane w klasie podstawowej.Tego duplikowania odpady miejsca i wymaga określić, które kopie członkowie klasy podstawowej ma użytkownik uzyskuje dostęp.
Gdy klasa podstawowa jest określony jako wirtualnego base, może działać jako pośredniego base więcej niż jeden raz bez powielania jego członków danych.Pojedynczą kopię swoich członków danych jest współużytkowany przez wszystkich podstawowych klas, które go użyć jako podstawy wirtualnych.
W przypadku deklarowania wirtualne klasy bazowej, wirtualnego słowa kluczowego pojawia się na listach podstawowych klas pochodnych.
Należy wziąć pod uwagę hierarchia klas na poniższym rysunku, ilustruje linii obiad symulowane.
Symulowane obiad liniowym
Na rysunku Queue jest klasą podstawową dla obu CashierQueue i LunchQueue.Jednakże, gdy obie klasy są połączone formularza LunchCashierQueue, pojawia się następujący problem: Nowa klasa zawiera dwa podobiektów typu Queue, jeden z CashierQueue , a druga z LunchQueue.Na poniższym rysunku pokazano układ koncepcyjne pamięci (układ rzeczywisty pamięci może być zoptymalizowana).
Symulowane obiektu obiad linii
Należy zauważyć, że istnieją dwie Queue subobjects w LunchCashierQueue obiektu.W poniższym kodzie deklarowane Queue się wirtualne klasy podstawowej:
// deriv_VirtualBaseClasses.cpp
// compile with: /LD
class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};
virtual Słowa kluczowego daje pewność, że tylko jedna kopia podobiektów Queue jest włączone (patrz poniższy rysunek).
Symulowane obiektu linii obiad z wirtualnego klas podstawowych
Klasa może mieć zarówno składnik wirtualnych i niewirtualna składników danego typu.Dzieje się tak w warunkach zilustrowane na poniższym rysunku.
Składniki wirtualnej i niewirtualna tej samej klasy
Na rysunku CashierQueue i LunchQueue używać Queue jako wirtualnego klasy podstawowej.Jednakże TakeoutQueue Określa Queue jako klasa podstawowa nie wirtualne klasy podstawowej.W związku z tym LunchTakeoutCashierQueue ma dwa podobiektów typu Queue: jeden ze ścieżki dziedziczenia, która zawiera LunchCashierQueue i jeden ze ścieżki, która zawiera TakeoutQueue.Ilustruje to poniższy rysunek.
Układ obiektu z wirtualnej i niewirtualna dziedziczenie
[!UWAGA]
Dziedziczenie wirtualnej zapewnia znaczącej wielkości korzyści w porównaniu z dziedziczenia niewirtualna.Jednak to wprowadzenie dodatkowych niewielkiego.
Jeśli klasy pochodne zastępuje funkcję wirtualną, która dziedziczy z klasy bazowej wirtualnych i konstruktora lub destruktora dla wywołań pochodna klasy podstawowej, które działają przy użyciu wskaźnika do wirtualnej klasy podstawowej, kompilator mogą wprowadzić pola ukryte dodatkowe "vtordisp" do klasy z podstaw wirtualnych.Opcja kompilatora /vd0 pomija dodanie członka przemieszczenie konstruktora/destruktora vtordisp ukryte.Opcję kompilatora /vd1, domyślnie, umożliwia im gdzie są one konieczne.Wyłącz vtordisps tylko wtedy, gdy masz pewność, że wszystkie klasy konstruktory i destruktory wywoływać funkcje wirtualnych praktycznie.
Opcja kompilatora /vd wpływa na kompilację całego modułu.Użyj vtordisp pragma, aby wyłączyć i ponownie włączyć vtordisp pola na podstawie klasy przez klasy:
#pragma vtordisp( off )
class GetReal : virtual public { ... };
#pragma vtordisp( on )