69725

Віртуальні базові класи

Лекция

Информатика, кибернетика и программирование

Як вказано в коментарях, класи derivedl і derived2 є спадкоємцями класу base. Проте клас deribed3 є похідним від обох класів derived2 і derived1. (Таке наслідуванно називається діамантовим). Отже, в об’єкті класу derived3 містяться дві копії об’єкту класу base.

Украинкский

2014-10-09

42 KB

0 чел.

Тема 3: Віртуальні базові класи

При множинному наслідуванні може виникнути неоднозначність. Розглянемо, наприклад, наступну неправильну програму.

//  Ця програма містить  помилку і не  компілюється.

#include <iostream>

using namespace std;

class base   {

public:

int  i;

};

// Клас derivedl є спадкоємцем класу base.

class derivedl : public base {

public:

int j ;

};

// Клас derived2 є спадкоємцем класу base 

class derived2 : public base {

public:

int k;

};

/* Клас derived3 є спадкоємцем класів derivedl і derived2. Отже, в класі

derived3 існують дві копії класу base! */

class derived3 : public derivedl, public derived2 {

public:

int sum;

};

int main() {

derived3 ob;

ob.i = 10; ob.j = 20; ob.k = 30;

// Неоднозначність, яка змінна i мається

// Тут змінна i також визначена неоднозначно.

ob. sum = ob. i + ob. j + ob.k;

// Тут змінна i також визначена неоднозначно

cout << ob.i << " ";

cout « ob.j « " " « ob.k « " ";

cout << ob.sum;

return 0;

}

Як вказано в коментарях, класи derivedl і derived2 є спадкоємцями класу base. Проте клас deribed3 є похідним від обох класів derived2 і derived1. (Таке наслідуванно називається діамантовим). Отже, в об'єкті класу derived3 містяться дві копії об'єкту класу base. Таким чином, вираз

 ob.i  =  20;

у якому відбувається звернення до змінної i, стає неоднозначним, оскільки невідомо, з об'єкту якого класу слід узяти цю змінну: derivedl або derived2. Володіючи двома копіями об'єкту класу base, об'єкт класу ob містить два екземпляри змінної ob.i! Як видимий, цей оператор в принципі неоднозначний.

Цю програму можна виправити двома способами. По-перше, до змінній i можна застосувати оператора дозволу області видимості. Наприклад, наступна програма працює абсолютно правильно

//   У  цій програмі для  явного  вибору  змінної  i

//   застосовується  оператор дозволу  області видимості.

#include  <iostream>

using namespace  std;

class  base   {

public:

int   i ;

};

// Клас derivedl є спадкоємцем класу base

class derivedl : public base {

public:

int j ;

};

// Клас derived2 є спадкоємцем класу base 

class derived2 : public base {

public:

int k;

};

/* Клас derived3 є спадкоємцем класів derivedl і derived2 одночасно.

Отже, в кожному його об'єкті містяться дві копії об'єкту класу base! */

class derived3 : public derivedl, public derived2 {

public:

int sum;

};

int main() {

derived3 ob;

ob.derivedl::i = 10; // Неоднозначність усунена

// використовується змінна i з класу derivedl .

ob.j = 20; ob.k = 30;

// Неоднозначність усунена

ob.sum = ob.derivedl::i + ob.j + ob.k;

// Неоднозначність усунена

cout « ob.derivedl::i « " ";

cout « ob.j « " " « ob.k « " "; cout << ob.sum;

return 0;

}

Як видимий, оператор дозволу області видимості "::" дозволяє явно вибрати варіант похідного класу. Проте це рішення породжує нові проблеми. Що якщо насправді потрібна лише одна копія об'єкту класу base? Чи можна запобігти дублюванню об'єктів класу base в об'єкті класу derivad3? На обидва питання можна відповісти позитивно. Вирішення цих проблем засноване на застосуванні віртуальних базових класів (virtual base classes).

Якщо базовий клас має декілька спадкоємців, його дублюванню можна запобігти. Для цього в оголошенні похідного класу перед ім'ям базового класу слід поставити ключове слово virtual. Наприклад, попередню програму можна виправити таким чином.

class derivedl : virtual public base {

public:

int j ;

};

// Клас derivedl є спадкоємцем віртуального класу base.

class derived2 : virtual public base {

public:

int k;

};

/* Клас derived3 є спадкоємцем класів derivedl і derived2.

Цього разу його об'єкт містить лише одну копію об'єкту базового класу. */

class derived3 : public derivedl, public derived2 {

public:

int sum;

};

Як видимий, перед ім'ям базового класу в специфікації похідного класу стоїть ключове слово virtual. Тепер обидва класи derivedl і derived2 є спадкоємцями віртуального базового класу base, і будь-які їх спадкоємці міститимуть лише одну копію класу base. Отже, об'єкт класу derived3 містить копію об'єкту класу base, і вираз ob.i=10 стає абсолютно правильним і однозначним.

Слід мати на увазі, що, хоча класи derivedl і derived2 оголосили клас base віртуальним, його об'єкти будуть як і раніше частиною об'єктів будь-якого з цих типів. Наприклад, наступний фрагмент є абсолютно правильним.

//   Визначуваний об'єкт  класу derivedl 

derivedl myclass; myclass.i  =   88;

Відмінність між звичайним базовим класом і віртуальним виявляється, тільки коли об'єкт успадковує декілька об'єктів одного і того ж базового класу. Якщо використовується віртуальний базовий клас, то його об'єкт тільки один раз копіюється в кожен об'єкт похідного класу. Інакше виникає неоднозначність.


 

А также другие работы, которые могут Вас заинтересовать

43978. Способи обробки субпродуктів. Особливості зберігання продуктів 1.35 MB
  Загальна характеристика субпродуктів 3. Способи обробки субпродуктів 5. Удосконалено технологічні процеси приготування напівфабрикатів з субпродуктів у процесі правильної технології їх виробництва первинної і теплової обробки відповідних субпродуктів. Розробляються і використовуються нові електрофізичні біотехнічні і ферментативні методи обробки субпродуктів.
43979. ОДЕРЖАННЯ ГАЛОГЕНІЗОТІОЦІАНАТІВ ТА ДОСЛІДЖЕННЯ ЇХ ВЗАЄМОДІЇ З ГІДРОКСИБЕНЗАЛЬДЕГІДАМИ 2.41 MB
  Дотримання правил техніки безпеки є обов’язковим для кожного працівника під час роботи в хімічній лабораторії. Більш досвідчені працівники мають створювати такі умови праці в лабораторії при яких було б неможливе недбале ставлення до вимог техніки безпеки. До роботи в хімічній лабораторії допускаються особи які пройшли медичне обстеження та інструктаж з техніки безпеки.
43980. Исследование вопросов оформления и учета операций в иностранной валюте банками Республики Беларусь и разработка путей их развития 403 KB
  Понятие и сущность операций в иностранной валюте. Внебиржевой порядок Основные направления развития операций в иностранной валюте в Республике Беларусь. Целью работы является исследование вопросов оформления и учета операций в иностранной валюте банками Республики Беларусь и разработка путей их развития. Исходя из поставленной цели предметом работы является порядок оформления и учета операций в иностранной валюте банками Республики Беларусь.
43981. Правила складання і оформлення актів 240.5 KB
  Сукупність взаємоповязаних документів, які застосовуються у певній сфері діяльності, становить систему документації. Нині діють уніфіковані системи. Однією з найпоширеніших є організаційно - розпорядча документація (ОРД), використовувана в оформленні управлінських рішень.
43982. Цифровая система видеонаблюдения 2.38 MB
  С развитием цифровых технологий эта задача может быть решена внедрением системы видеонаблюдения английская аббревиатура CCTV Closed Circuit TeleVision Системы замкнутого телевидения. В зависимости от типа используемого оборудования системы видеонаблюдения делят на аналоговые и цифровые. Аналоговые системы видеонаблюдения используют там где необходимо организовать видеонаблюдение в небольшом числе помещений и информацию с видеокамер записывать на видеомагнитофон. Для обеспечения безопасности особо ответственных или...
43983. Организация автоматизированного учета и контроля деятельности религиозных организаций с использованием ПЭВМ (на примере администрации Октябрьского р-на г. Минска) 12.1 MB
  Данная активизация устанавливает определенные проблемы по традиционному учету деятельности религиозных организаций. Целью данной дипломной работы является организация автоматизированного учета и контроля деятельности религиозных организаций с использованием ПЭВМ на примере администрации Октябрьского рна г. Целью данной дипломной работы является организация автоматизированного учета и контроля за деятельностью религиозных организаций на примере администрации Октябрьского рна г. В связи с поставленной целью были намечены следующие задачи: ...
43984. Кредитование во внешнеторговой деятельности 288.5 KB
  Средства для международного кредита мобилизуются на международном рынке ссудных капиталов, на национальных рынках ссудного капитала, а также за счет использования ресурсов государственных, региональных и международных организаций. Размер кредита и условия его представления фиксируются в кредитном соглашении (договоре) между кредитором и заемщиком
43985. Банковская система. Банковские риски и методы их регулировани 701 KB
  В первом случае речь идет о шансах получения прибыли а во втором о рисках. Предоставляя ссуды коммерческий банк исходит прежде всего из рыночных критериев прибыльности риска и ликвидности. Значение посреднической функции коммерческих банков для успешного развития рыночной экономики состоит в том что они своей деятельностью уменьшают степень риска и неопределенности в экономической системе. Именно такая неопределенность и повышенный уровень риска это плата за полученную экономическую свободу хотя имеющаяся экономическая свобода еще...
43986. Разработка методику проведения контроля с использованием заданий нестандартной формы по теме «Логарифмическая функция» 1.82 MB
  Обилие литературы по проблеме мотивации и мотивов сопровождается и многообразием точек зрения на их природу что вынуждает некоторых психологов впадать в излишний пессимизм и говорить о практической неразрешимости проблемы. Общим недостатком существующих точек зрения и теорий является отсутствие системного подхода к рассмотрению процесса мотивации