Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 Пример:
|