struct Circle:Shape {
void draw_lines(int) const; // возможно, ошибка (аргумент int?)
void drawlines() const; // возможно, ошибка (опечатка
в имени?)
void draw_lines(); // возможно, ошибка (нет const?)
// ...
};
В данном случае компилятор увидит три функции, независимые от функции Shape::draw_lines()
Пример функции draw_lines()
struct B {
virtual void f() const { cout << "B::f "; }
void g() const { cout << "B::g "; } // невиртуальная
};
struct D : B {
void f() const { cout << "D::f "; } // замещает функцию B::f
void g() { cout << "D::g "; }
};
struct DD : D {
void f() { cout << "DD::f "; } // не замещает функцию D::f
(нет const)
void g() const { cout << "DD::g "; }
};
Здесь мы описали небольшую иерархию классов с одной виртуальной функцией f()
f()
и невиртуальную функцию g()
, не знающую конкретного типа объекта, который она должна вывести на печать, за исключением того, что он относится либо к классу B
, либо к классу, производному от класса B
.void call(const B& b)
// класс D — разновидность класса B,
// поэтому функция call() может
// получить объект класса D
// класс DD — разновидность класса D,
// а класс D — разновидность класса B,
// поэтому функция call() может получать объект класса DD
{
b.f();
b.g();
}
int main()
{
B b;
D d;
DD dd;
call(b);
call(d);
call(dd);
b.f();
b.g();
d.f();
d.g();
dd.f();
dd.g();
}
В результате выполнения этой программы получим следующее:
B::f B::g D::f B::g D::f B::g B::f B::g D::f D::g DD::f DD::g
Если вы понимаете, почему, то знаете механизмы наследования и виртуальных функций.
14.3.4. Доступ
private
, то его имя могут использовать только члены данного класса.protected
, то его имя могут использовать только члены данного класса или члены классов, производных от него.public
, то его имя могут использовать все функции.Изобразим это на рисунке.
Базовый класс также может иметь атрибут private
protected
или public
.• Если базовый класс для класса D
D
. • Если базовый класс для класса D
D
и членами классов, производных от класса D
.• Если базовый класс для класса D
Эти определения игнорируют понятие дружественной функции или класса и другие детали, которые выходят за рамки рассмотрения нашей книги. Если хотите стать крючкотвором, читайте книги Stroustrup,