22 Зак. 3626
658 ПРИЛОЖЕНИЕ Г. Ответы
Упражнения
Ниже показана иерархия наследования для абстрактного класса S hape и произво дных от него классов C i r c l e и T r ia n g le .
#include
using namespace std;
class Shape
{
public:
virtual double AreaO = 0;
virtual void Print() = 0;
class Circle
{
double Radius;
public:
Circle(double inputRadius) : Radius(inputRadius) {}
double Area()
{
return 3.1415 * Radius * Radius;
}
void Print()
{
cout « "Circle says hello!" « endl;
class Triangle
{
double Base, Height;
public:
Triangle(double inputBase, double inputHeight) : Base(inputBase), Height(inputHeight) {}
double AreaO
{
return 0.5 * Base * Height;
}
void Print()
{
cout « "Triangle says hello!" « endl;
}
};
int main()
{
Circle myRing(5);
Triangle myWarningTriangle(6.6, 2);
|
|
|
|
Ответы к занятию 12
|
659
|
cout
|
«
|
"Area
|
of
|
circle: " « myRing.Area() « endl;
|
|
cout
|
«
|
"Area
|
of
|
triangle: " « myWarningTriangle.Area() « endl;
|
|
myRing.Print();
myWarningTriangle.Print();
return 0;
}
Отсутствует виртуальный деструктор!
Без виртуального деструктора последовательность выполнения конструкторов была бы такой: V e h ic le (), затем С аг (), а виртуальный деструктор будет вызван только один -С аг ().
Ответы к занятию 12
Контрольные вопросы
Нет, язык C++ не позволяет двум функциям с тем же именем иметь разные возвра щаемые значения. Вы можете создать две реализации оператора [ ] с идентичны ми типами возвращаемого значения, но один оператор определен как константная функция, и другой нет. В данном случае компилятор C++ выбирает не константную версию для действий, связанных с присвоением, и константную версию в против ном случае:
Туре& operator[](int Index) const; Type& operator[](int Index);
Да, но только если я не хочу, чтобы мой класс позволил копировать или присваивать себя.
Поскольку у него нет никаких динамически распределенных ресурсов, содержав шихся в пределах класса D ate, способных вызвать ненужные циклы резервирова ния и освобождения памяти в пределах конструктора копий или оператора присвое ния копии, этот класс не является хорошим кандидатом на наличие конструктора перемещения или оператор присваивания при перемещении.
Упражнения
Оператор преобразования i n t (). class Date
{
int Day, Month, Year; public:
operator int()
{
return ((Year * 10000) + (Month * 100) + Day);
}
// конструктор и т.д
ПРИЛОЖЕНИЕ Г. Ответы
Конструктор перемещения и оператор присваивания при перемещении приведены ниже.
class Dynlntegers
{
private:
int* plntegers;
public:
Конструктор перемещения Dynlntegers(Dynlntegers&& MoveSource)
{
plntegers = MoveSource.plntegers; // взять собственность MoveSource.plntegers = NULL; // освободить источник
Do'stlaringiz bilan baham: |