14.3.5. Чисто виртуальные функции
Абстрактный класс — это класс, который можно использовать только в качестве базового. Абстрактные классы используются для представления абстрактных понятий; иначе говоря, мы используем абстрактные классы для описания понятий, которые являются обобщением общих характеристик связанных между собой сущностей.
class B { // абстрактный базовый класс
public:
virtual void f()=0; // чисто виртуальная функция
virtual void g()=0;
};
B b; // ошибка: класс B — абстрактный
Интересное обозначение =0
B::f()
и B::g()
являются чистыми, т.е. они должны быть замещены в каком-то производном классе. Поскольку класс B содержит чисто виртуальную функцию, мы не можем создать объект этого класса. Замещение чисто виртуальных функций устраняет эту проблему.class D1:public B {
public:
void f();
void g();
};
D1 d1; // OK
Несмотря на то что все чисто виртуальные функции замещаются, результирующий класс остается абстрактным.
class D2:public B {
public:
void f();
// no g()
};
D2 d2; // ошибка: класс D2 — (по-прежнему) абстрактный
class D3:public D2 {
public:
void g();
};
D3 d3; // OK
14.4. Преимущества
объектно-ориентированного программирования Circle
Shape
, или разновидностью класса Shape, то делаем это для того, чтобы достичь следующих целей (по отдельности или всех вместе).•
Shape
(обычно в качестве аргумента, передаваемого по ссылке), может принять аргумент класса Circle
(и использовать его с помощью интерфейса класса Shape
).•
Circle
и его функции-члены, мы можем использовать возможности (т.е. данные и функции-члены), предоставляемые классом Shape
. Never_do_this
Shape
является открытым базовым классом. Затем мы могли бы заместить функцию Shape::draw_lines()
функцией, которая не рисует фигуру, а просто перемещает ее центр на 100 пикселей влево. Этот проект фатально неверен, поскольку, несмотря на то, что класс Never_do_this
может предоставить интерфейс класса Shape
, его реализация не поддерживает семантику (т.е. поведение), требуемое классом Shape
. Никогда так не делайте! Shape
Shape
). Circle
Shape
).