Виртуална програмиране базов клас в С и С

// програма съдържа грешка и няма да се компилира
#include
клас база публично:
Int I;
>;
// d1 наследява база.
клас d1. публична база публично:
Int J;






>;
// d2 наследява база.
клас d2. публична база публично:
Int к;
>;
/ * D3 наследство като D1 и D2. Това означава, че d3 има две копия на основата! * /
клас D3. обществен d1, d2 публичен обществен:
Int m;
>;
INT главната ()
d3 г;
Д. = 10; // несигурност, което аз.
D.J = 20;
d.k = 30;
d.m = 40;
// несигурността което аз.
Cout < Cout < Cout < връщане 0;
>

Има два начина за коригиране на програмата. Първата е да се използва оператора на определяне на обхвата на променливата и с последващо ръчен избор на един от най-аз. Например, следващата версия на програмата се компилира и изпълнява, ако е необходимо:

#include
клас база публично:
Int I;
>;
// d1 наследява база.
клас d1. публична база публично:
Int J;
>;
// d2 наследява база.
клас d2. публична база публично:
Int к;
>;
/ * D3 наследство като D1 и D2. Това означава, че d3 има две копия на основата! * /
клас D3. обществен d1, d2 публичен обществен:
Int m;
>;
INT главната ()
d3 г;
d.d2 :: = I 10; // обхват се определя, и се използва за d2
D.J = 20;
d.k = 30;
d.m = 40;
// обхват се определя, и се използва за d2
Cout < Cout < Cout < връщане 0;
>

Както се вижда от отчета за обхват. програма ръчно избран версия на базата d2 класа. Въпреки това, това решение води до по-дълбок въпрос: какво ще стане ако ви трябва само едно копие на база клас? Има ли някакъв начин да се предотврати, включително chenie двете копия до клас D3? Както можете да предположите, че отговорът на този въпрос е да. Разтворът се получава чрез използване на виртуална база класа.







Когато две или повече класове, се генерират от общ базов клас може predot порти включване на няколко копия на базовия клас в детската Целта на тези класове от Ad-среда виртуален базов клас с наследството му. Например, тук е друга версия на предишната програма, която d3 съдържа само едно копие на база клас:

#include
клас база публично:
Int I;
>;
// d1 наследява база като виртуална
клас d1. виртуална публична база публично:
Int J;
>;
// d2 наследява база като виртуална
клас d2. виртуална публична база публично:
Int к;
>;
/ * D3 наследство като D1 и D2. Независимо от това, d3, има само едно копие на базата! * /
клас D3. обществен d1, d2 публичен обществен:
Int m;
>;
INT главната ()
d3 г;
Д. = 10; // няма по несигурност
D.J = 20;
d.k = 30;
d.m = 40;
Cout < Cout < Cout < връщане 0;
>

Както може да се види, виртуалната ключова дума, се предшества от получени спецификация клас. Сега, както d1 клас и d2 наследи базовия клас като виртуална. Всяко множество наследство с участието си в момента генерира включването на само едно копие на базата клас. Ето защо, в d3 в класната стая
има само едно копие от класа на основа, и следователно, Д. = 10 вече не е двусмислен Nym експресия.

Трябва да се има предвид и още един факт: въпреки че и двата класа d1 и d2 се използва като виртуален базов клас, но всеки обект клас d1 или d2 ще съдържа база. Например, следния код е абсолютно прав:

// определение клас от тип d1
d1 MyClass;
myclass.i = 100;

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