Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
}
Виртуальные базовые классы
При множественном наследовании класс не может быть прямым базовым более одного раза. Однако класс может быть неоднократно косвенно базовым.
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
Дата публикования: 2014-11-28; Прочитано: 240 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!