Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Void move ( int xn, int yn)

{ hide();

x= xn; y= yn;

show(); }

};

// множественное наследование

#include <conio.h.

#include ”circ.cpp”

#include “square.cpp”

class cirsqu: public circ, public square {

// производный класс двух базовых классов, нет своих данных

public:

cirsqu(int xi, int yi, int ri): // конструктор, параметры для

// инициализации данных базовых классов

circ(xi, yi, ri), // явно вызываются конструкторы

square(xi, yi, 2*ri) { } // базовых классов

//так чтобы координаты центра окружности и квадрата совпадали,

// а сторона квадрата была равна диаметру окружности

Void show ()

{circ::show(); square::show();}

Void hide()

{ circ::hide(); square::hide();}

Void move(int xn,int yn)

{circ::move(xn,yn); square::move(xn,yn);}

};

Void main ()

{int d=DETECT, m;

initgraph(&d, &m, "D:\\Borlandc\\BGI");

int errorcode=graphresult();

if(errorcode!=grOk){cout<<"Ошибка "; exit(0);}

Cirsqu a1(100,100,50);

Cirsqu a2(400,300,30);

A1.show(); getch();

A2.show(); getch ();

A2.move(50,50); getch();

A2.hide(); getch();

A1.hide(); getch();

Closegraph();

}

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

 

При множественном наследовании класс не может быть прямым базовым более одного раза. Однако класс может быть неоднократно косвенно базовым.

 

class A { // самый верхний базовый класс А

protected:

Int x;

... };

class B: public A { // класс В, производный от А

... };

class C: public A { // класс С, производный от А

... };

class D: public B, public C { // класс D, производный и от В и от С

... };

A A

B C

D

 

В этом случае происходит дублирование или “размножение” базового класса при множественном наследовании.

В объект класса D входят все составляющие базовых классов B и C и следовательно члены класса А войдут в него дважды, как составляющие базового класса В и как составляющие базового класса С. В результате переменная x будет присутствовать в двух экземплярах.

С точки зрения компилятора такая ситуация не является ошибочной. Однако при обращении к x придется его однозначно специфицировать.

 

class D: public B, public C {

public:

int GetX() {return x} // не допустимо

int GetX () { return B::x; } // x получено через В

SetX (_x) { C::x = _x;} // x получено через С

};

Ниже представлена программа дублирования базового класса.

Класс “ круглое пятно, вписанное в эллипс ” – spotelli базируется на классах spot (“ пятно”) и ellips (“ эллипс”), каждый из которых базируется на классе point.

Объект базового класса point дублируется:

 

 

point point

spot ellips


Дата добавления: 2015-07-15; просмотров: 90 | Нарушение авторских прав


Читайте в этой же книге: Void main ( ) | Int y ; | Int y ; | Putimage(x-rad, y-rad, pspot, XOR_PUT); |
<== предыдущая страница | следующая страница ==>
Множественное наследование. Виртуальные базовые классы| spotelli

mybiblioteka.su - 2015-2024 год. (0.006 сек.)