Множественное наследование используется тогда, когда необходимо наделить производный класс свойствами более чем одного класса. В тех случаях, когда в базовых классах содержатся методы с одинаковыми именами, доступ к ним из производного класса осуществляется с помощью явного указания имени класса, членами которого они являются.
class A {
public:
...
void mf(void);
};
class B {
...
public:
...
void mf(void);
};
class C: public A, public B {
public:
...
};
C c;
c.A::mf(); // вызывается функция класса A
c.B::mf(); // вызывается функция класса B
Виртуальные базовые классы
Для классов, порожденных от производных классов, с общим виртуальным классом, существует только один экземпляр объекта общего базового класса.
class V {
...
public:
...
void Vmf(void);
};
class A: virtual public V, public S {
...
public:
...
void Amf(void);
};
class B: virtual public V, public T {
...
public:
...
void Bmf(void);
};
class C: public A, public B {
...
public:
};
Класс V является единственным общим объектом внутри класса C, то есть - общим для классов A и B, входящих в состав класса C.
Пример. Наследование вектора.
Унаследуем динамический массив из предыдущего задания таким образом, чтобы в элементах базового вектора хранились рациональные числа. Размерность производного вектора при этом будем считать вдвое меньшей, по сравнению с базовым классом.
class Vector;
class Ratio;
class ratiovector: public Vector
{
public:
//========== Конструкторы ======//
// Конструктор:
ratiovector(int N=0): Vector(N*2) {}
// Конструктор копирования – не наследуется:
ratiovector(const ratiovector& src): vector((const vector&)src) {}
//============= Перегрузка [] ==========//
Ratio operator [] (int index)
{
return Ratio(v[index*2], v[index*2+1]);
}
//============= Присваивание ==========//
void Set(int index, const Ratio& src)
{
v[index*2] = src.a; v[index*2+1] = src.b;
}
//============= Сложение ==========//
ratiovector& operator+=(ratiovector& src)
{
if (len!= src.len) return *this;
for (int k=0; k < src.len/2; k++) {
int ch = v[k*2] * src.v[k*2+1] + v[k*2+1] * src.v[k*2];
int zn = v[k*2+1] * src.v[k*2+1];
v[k*2] = ch;
v[k*2+1] = zn;
}
return *this;
}
// Деструктор - наследуется
};
Вариант
Базовый класс – массив вещественных чисел, производный класс – массив вещественных чисел, представленных в виде пар чисел x=M*10^e, где M – мантисса числа, e – экспонента (например, число 15.432=1.5432*10^(1), то есть: M=1.5432 e=1).
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания.
Переопределите операции вставки, удаления элемента, а также операторы: [ ], +=, -=, *=, /=. Арифметические операторы применяются поэлементно.
Вариант
Базовый класс – массив целых чисел, производный класс – массив рациональных чисел чисел, представленных по модулю числа N (то есть в виде пар: целая часть при делении на N, остаток от деления на N).
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания.
Переопределите операции вставки, удаления элемента, а также операторы: [ ], +=, -=, *=, /=. Арифметические операторы применяются поэлементно.
Вариант
Базовый класс – массив вещественных чисел, производный класс – массив двумерных векторов.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания.
Переопределите операции вставки, удаления элемента, а также операторы: [ ], +=, -=, *=. Умножение –произведение каждого вектора на матрицу 2x2, представленную отдельным классом.
Вариант
Базовый класс – массив вещественных чисел, производный класс – массив трехмерных векторов.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания.
Переопределите операции вставки, удаления элемента, а также операторы: [ ], +=, -=, *=. Умножение – векторное произведение векторов.
Вариант
Базовый класс – массив вещественных чисел, производный класс – массив пар чисел (x,y) с операциями:
(x,y)+(z,k)=(xz,yk), (x,y)-(z,k)=(x/z,y/k), a(x,y)=(xa,ya)
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания. Переопределите операции [ ], +=, -=, *= (число).
Вариант
Базовый класс – массив чисел, производный класс – массив комплексных чисел.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания.
Переопределите операции вставки, удаления элемента, а также операторы: [ ], +=, -=, *=. Определите метод класса, возвращающий минимальный по модулю вектор в массиве.
Вариант
Базовый класс – массив чисел, производный класс – массив рациональных чисел.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания. переопределите операции вставки, удаления элемента, переопределите операции [ ], +=, -=, *=.
Вариант
Базовый класс – массив чисел, производный класс – массив дат, представленных тройками чисел: день, месяц, год.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания.
Переопределите операции вставки, удаления элемента, переопределите операции [ ], +=, -=.
Вариант
Базовый класс – массив чисел, производный класс – массив времен, представленных тройками чисел: часы, минуты, секунды.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания. Переопределите операции вставки, удаления элемента, переопределите операции [ ], +=, -=.
Вариант
Базовый класс – массив чисел, производный класс – массив квадратных матриц 2х2.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания. Переопределите операции [ ], +=, -=, *=.
Вариант
Базовый класс – массив чисел, производный класс – массив квадратных трехчленов.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания. Переопределите операции [ ], +=, -=, *= (число).
Вариант
Базовый класс – массив чисел, производный класс – массив полиномов 4 порядка с условием Р(0)=0.
Определите в нем конструктор, деструктор, конструктор копирования, оператор присваивания. Переопределите операции [ ], +=, -=, *= (число).
Вариант
Базовый класс – массив чисел, производный класс – квадратная матрица 2х2 со скалярным произведением (A,B)=tr(AB) (tr – «след» матрицы, сумма ее диагональных элементов).
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции доступа к элементу матрицы, +=, -=, *, где умножение - скалярное произведение по приведенной выше формуле.
Вариант
Базовый класс – массив чисел, производный класс – массив полиномов 3 порядка.
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции [ ], +=, -=, *= (число).
Вариант
Базовый класс – массив чисел, производный класс – квадратный трехчлен со скалярным произведением:
(P,Q)=P(-1)Q(-1)+P(0)Q(0)+P(1)Q(1)
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции [ ], +=, -=, *=. Умножение – скалярное произведение по приведенной выше формуле.
Вариант
Базовый класс – массив чисел, производный класс – квадратный трехчлен со скалярным произведением:
(P,Q)=P'(-1)Q'(-1)+P'(0)Q'(0)+P'(1)Q'(1)
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции [ ], +=, -=, *=. Умножение – скалярное произведение по приведенной выше формуле.
Вариант
Базовый класс – массив чисел, производный класс – квадратный трехчлен со скалярным произведением:
(P,Q)=P (0)Q(0)+P'(0)Q'(0)+P''(0)Q''(0)
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции [ ], +=, -=, *=. Умножение – скалярное произведение по приведенной выше формуле.
Вариант
Базовый класс – массив чисел, производный класс – квадратная симметричная матрица 2х2, поддерживающая дополнительные операции умножения.
Определите в нем конструктор, деструктор, конструктор копирования.
Переопределите операции доступа к элементу матрицы, +=, -=,*= (число) и *= (матрица).
Вариант
Базовый класс – массив чисел, производный класс – матрица произвольной размерности, поддерживающая операции сложения и умножения на другие матрицы по правилам линейной алгебры.
Определите в нем конструктор, деструктор, конструктор копирования.
Переопределите операции доступа к элементу матрицы, +=, -= и *=.
Вариант
Базовый класс – массив чисел, производный класс – матрица произвольной размерности, поддерживающая операции вставки дополнительного ряда и столбца (оба – представлены векторами).
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции доступа к элементу матрицы, операции вставки дополнительного ряда и столбца.
Вариант
Базовый класс – массив чисел, производный класс – матрица произвольной размерности, поддерживающая операции удаления любого ряда и столбца.
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции доступа к элементу матрицы, операции удаления дополнительного ряда и столбца.
Вариант
Базовый класс – вектор чисел, производный класс – матрица произвольной размерности, поддерживающая операции сложения, вычитания, умножения на число и умножения на вектор.
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции доступа к элементу матрицы, операции +=, -=, *= (число), *=(вектор).
Вариант
Базовый класс – массив чисел, производный класс – матрица размерности 3х3, сумма всех элементов которой равна нулю. Должны поддерживаться операции сложения и умножения на другие такие матрицы по правилам линейной алгебры.
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции доступа к элементу матрицы, +=, -= и *=.
Вариант
Базовый класс – массив чисел, производный класс – матрица размерности 2х2 со скалярным произведением:
(A,B)=a11b11+a12b12+a22b22
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции доступа к элементу матрицы, +=, -= и *=.
Вариант
Базовый класс – массив чисел, производный класс – евклидово пространство вектор‑столбцов 3х1, ортогональных заданному вектору а.
Определите в нем конструктор, деструктор, конструктор копирования. Переопределите операции [ ], +=, -= и *= (число).