Помогни ни да направим Uroci.net по - богат! Добави урок

C++ част.8 (Обектно-ориентирано)

C++ » C++
fix3d   трудност:    видян: 31969



Ред на конструкторите и деструкторите

Виртуалните базови класове се конструират преди не виртуалните базови класове независимо от това къде се разположени в списъка с извличанията. Ако даден клас има два базови класа, и единият от двата е виртуален, винаги се вика пръв конструктора на виртуалния базов клас. Деструкторът на виртуалния базов клас се вика последен. Например,

class TeddyBear : public Bear,public virtual ToyAnimal { ... };
TeddyBear pooh;

Извикването на конструкторите за pooh става в следния ред:

ToyAnimal(); // virtual base
classZooAnimal(); // base class of Bear;
Bear(); // nonvirtual base
class TeddyBear();

Редът на извикване на деструкторите е обратен.

Ако един клас има повече виртуални базови класове, техните конструктори се викат по реда, по който са декларирани виртуалните базови класове. Като имаме в предвид това, можем да кажем, че се следва един нормален начин на извикване на конструкторите за един обектна извлечен клас.

По-сложен е случаят, в който виртуалният базов клас е nested в йерархията на онаследяването. Например, Panda съдържа споделения от Bear и Raccoon виртуален базов клас ZooAnimal. Откриването на присъствието на виртуален базов клас изисква претърсване на целия граф на онаследяването на извлечения клас. Например, действителната дефиниция на Panda не предполага, че съществува виртуален базов клас:

class Panda : public Endangered, public Herbivore,
public Raccoon, public Bear { ... };
Panda yin Yang;

Действителното виртуално извличане от ZooAnimal се появява много по-назад в графа на онаследяването, когато се дефинират Raccoon и Bear. За yinYang редът на обръщенията към конструкторите е следния:

ZooAnimal(); // virtual base class
Herbivore(); // base class declaration
orderEndangered();
Raccoon();
Bear();
Panda();

За да се открие присъствието на виртуален базов клас, се претърсва йерархията на онаследяването по реда на декларациите на базовите класове. Например, представеното тук извличане на Panda, се претърсва по следния ред:

Endangered
Herbivore*
Raccoon*
Bear

Ako Endangered също съдържаше виртуален базов клас, редът за извикване на конструкторите за повече базови класове щеше да бъде както реда на търсене в йерархията. Например, виртуален базов клас, свързан с Endangered, се вика преди виртуалният базов клас ZooAnimal, свързан едновременно с Bear и Raccoon. Редът на извикване на деструкторите е обратен.

Едновременно използване на виртуални и не виртуални образци

Когато едно извличане съдържа едновременно виртуални и не виртуални образци на базов клас, създава се по един обект от базовия клас за всеки не виртуален образец и друг обект на базовия клас за всички виртуални образци. Например, ако се промени Endangered да бъде не виртуално извлечен от ZooANimal, Panda ще съдържа два образеца на ZooAnimal, виртуалния образец от Bear и Raccoon и не виртуалния образец от Endangered.

Отново съществуват два или повече образци на унаследените членове от базов клас. Изискват се псевдоними, които да указват кой точно образец се има в предвид.

Резюме

По подразбиране механизмът на онаследяване дефинира дърво на йерархията на онаследяването, в което всяка поява на базов клас поражда образец на базовия клас. Виртуалните базови класове осигуряват начин за пренебрегване на този подразбиращ се механизъм. Независимо от това колко често един виртуален базов клас се среща в йерархията на извличането, генерира се само един негов образец. Виртуалният базов клас служи като единствен, споделен образец.

В нашия пример ZooAnimal е виртуален базов клас едновременно на Bear и Raccoon. Panda, извлечен от Bear и Raccoon, съдържа единствения споделен образец на ZooAnimal.



Страници: «4 5 6 7

Сподели урока:



Регистрирайте се, за да добавите коментар


Калдейта Ком ЕООД - © 2003-. Всички права запазени.
Препоръчваме: IT Новини