Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Vector& operator=(const Vector&); // копирующее присваивание

// ...

private:

int sz;

double* p;

};

void f(int ss)

{

Vector v(s);

Vector v2 = v; // используем копирующий конструктор

// ...

v = v2; //
используем копирующее присваивание

// ...

}

По умолчанию (т.е. если вы не определили копирующий конструктор и копирующее присваивание) компилятор сам генерирует копирующие операции. По умолчанию копирование производится почленно (см. также разделы 14.2.4 и 18.2).

A.12.4. Производные классы

Класс можно определить производным от других классов. В этом случае он наследует члены классов, от которых происходит (своих базовых классов).

struct B {

int mb;

void fb { };

};

class D:B {

int md;

void fd;

};

В данном случае класс

B
имеет два члена:
mb
и
fb
, а класс
D
— четыре члена:
mb
,
fb
,
md
и
fd
.

Как и члены класса, базовые классы могут быть открытыми и закрытыми (

public
или
private
).

Class DD:public B1,private B2 {

// ...

};

В таком случае открытые члены класса

B1
становятся открытыми членами класса
DD
, а открытые члены класса
B2
— закрытыми членами класса
DD
. Производный класс не имеет особых привилегий доступа к членам базового класса, поэтому члены класса
DD
не имеют доступа к закрытым членам классов
B1
и
B2
.

Если класс имеет несколько непосредственных базовых классов (как, например, класс

DD
), то говорят, что он использует множественное наследование (multiple inheritance).

Указатель на производный класс

D
можно неявно преобразовать в указатель на его базовый класс
B
при условии, что класс
B
является доступным и однозначным по отношению к классу
D
. Рассмотрим пример.

struct B { };

struct B1: B { }; // B —
открытый базовый класс по отношению

// к классу B1

struct B2: B { }; // B — открытый базовый класс по отношению

// к классу B1

struct C { };

struct DD : B1, B2, private C { };

DD* p = new DD;

B1* pb1 = p; // OK

B* pb = p; // ошибка: неоднозначность: B1::B или B2::B

C* pc = p; // ошибка: DD::C — закрытый класс

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

Более подробную информацию о производных классах можно найти в разделе 14.3. Описание защищенного наследования (

protected
) изложено во многих учебниках повышенной сложности и в справочниках.

A.12.4.1. Виртуальные функции

Виртуальная функция (virtual function) — это функция-член, определяющая интерфейс вызова функций, имеющих одинаковые имена и одинаковые типы аргументов в производных классах. При вызове виртуальной функции она должна быть определена хотя бы в одном из производных классов. В этом случае говорят, что производный класс замещает (override) виртуальную функцию-член базового класса.

class Shape {

public:

virtual void draw; // "virtual" означает "может быть

// замещена"

virtual ~Shape { } // виртуальный деструктор

// ...

};

class Circle:public Shape {

public:

void draw; // замещает функцию Shape::draw

~Circle; // замещает функцию Shape::~Shape

// ...

};

По существу, виртуальные функции базового класса (в данном случае класса

Shape
) определяют интерфейс вызова функций производного класса (в данном случае класса
Circle
).

void f(Shape& s)

{

// ...

s.draw;

}

void g

{

Circle c(Point(0,0), 4);

f(c); // вызов функции draw из класса Circle

Поделиться:
Популярные книги

Подаренная чёрному дракону

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.07
рейтинг книги
Подаренная чёрному дракону

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Провинциал. Книга 8

Лопарев Игорь Викторович
8. Провинциал
Фантастика:
боевая фантастика
космическая фантастика
аниме
5.00
рейтинг книги
Провинциал. Книга 8

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Особое назначение

Тесленок Кирилл Геннадьевич
2. Гарем вне закона
Фантастика:
фэнтези
6.89
рейтинг книги
Особое назначение

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Как я строил магическую империю 6

Зубов Константин
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 6

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

Возвышение Меркурия. Книга 14

Кронос Александр
14. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 14

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ