Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Class Shape





{public: Shape(); virtual void Draw(void);};

class Square: public Shape

{public: Square(); virtual void Draw(void);

private:

double length; // длина стороны};

class Circle: public Shape

{public: Circle(); virtual void Draw(void); private:

short radius;};...

n Конкретные классы реализуют данный метод, и делают это по-разному.

n Однако в функции перерисовки текущей формы, если имеется указатель на базовый класс, достаточно лишь записать вызов виртуального метода, и динамически будет вызван нужный алгоритм рисования конкретной формы в зависимости от того, к какому из классов (Square, Circle и т.д.) принадлежит объект, на который указывает указатель shape:

Repaint(Shape* shape)

{

shape->Draw();

}

Виртуальные методы и переопределение методов

n Свойство виртуальности проявляется только тогда, когда обращение к методу идет через указатель или ссылку на объект.

n Указатель или ссылка могут указывать как на объект базового класса, так и на объект производного класса. Если же в программе имеется сам объект, то уже во время компиляции известно, какого он типа и, соответственно, виртуальность не используется.

Преобразование базового и производного классов

Объект базового класса является частью объекта производного класса. Если в программе используется указатель на производный класс, то его всегда можно без потери информации преобразовать в указатель на базовый класс. Поэтому во многих случаях компилятор может выполнить такое преобразование автоматически.

Circle* pC;

...

Shape* pShape = pC;

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

Shape * iPtr;

...

Circle * bPtr = Circle *)iPtr;

небезопасно. Такое преобразование можно выполнять только тогда, когда точно известно, что iPtr указывает на объект класса Circle.

Внутреннее и защищенное наследование

n В языке С++ имеется также внутреннее и защищенное наследование.

n Если перед именем базового класса ставится ключевое слово private, то наследование называется внутренним.

class B: private A

{

...

};

n В случае внутреннего наследования внешняя и защищенная части базового класса становятся внутренней частью производного класса. Внутренняя часть базового класса остается для производного класса недоступной.

n Если перед именем базового класса поставить ключевое слово protected, то будет использоваться защищенное наследование. При нем внешняя и защищенная части базового класса становятся защищенной частью производного класса. Внутренняя часть базового класса остается недоступной для производного класса.

n Фактически, при защищенном и внутреннем наследовании производный класс исключает из своего интерфейса интерфейс базового класса, но сам может им пользоваться. Разницу между защищенным и внутренним наследованием почувствует только класс, выведенный из производного.

 

Пример

Если в классе A был определен какой-то метод:

class A

{public:

int foo();

};

то запись

B b;

b.foo();

недопустима, так же, как и наследуемый от B

class C

{ int m() {

foo(); }

};

если класс B внутренне наследует A. Если же класс B использовал защищенное наследование, то первая запись b.foo() также была бы неправильной, но вторая была бы верна.

Абстрактные классы

n Класс, у которого есть хотя бы один чисто виртуальный метод, называется абстрактным.

n Пример:

Date: 2015-11-15; view: 269; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.009 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию