Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CPlusPlusNotesForProfessionals.pdf
Скачиваний:
47
Добавлен:
20.05.2023
Размер:
5.11 Mб
Скачать

Chapter 94: Return Type Covariance

Section 94.1: Covariant result version of the base example, static type checking

// 2. Covariant result version of the base example, static type checking.

class Top

{

public:

virtual Top* clone() const = 0;

virtual ~Top() = default; // Necessary for `delete` via Top*.

};

class D : public Top

{

public:

D* /* Covariant return */ clone() const override { return new D( *this ); }

};

class DD : public D

{

private:

int answer_ = 42;

public:

int answer() const { return answer_;}

DD* /* Covariant return */ clone() const override { return new DD( *this ); }

};

#include <iostream> using namespace std;

int main()

{

DD* p1 = new DD(); DD* p2 = p1->clone();

// Correct dynamic type DD for *p2 is guaranteed by the static type checking.

cout << p2->answer() << endl;

// "42"

delete p2;

 

delete p1;

 

}

 

Section 94.2: Covariant smart pointer result (automated cleanup)

// 3. Covariant smart pointer result (automated cleanup).

#include <memory> using std::unique_ptr;

template< class Type >

auto up( Type* p ) { return unique_ptr<Type>( p ); }

GoalKicker.com – C++ Notes for Professionals

495

class Top

{

private:

virtual Top* virtual_clone() const = 0;

public:

unique_ptr<Top> clone() const

{ return up( virtual_clone() ); }

virtual ~Top() = default; // Necessary for `delete` via Top*.

};

class D : public Top

{

private:

D* /* Covariant return */ virtual_clone() const override { return new D( *this ); }

public:

unique_ptr<D> /* Apparent covariant return */ clone() const { return up( virtual_clone() ); }

};

class DD : public D

{

private:

int answer_ = 42;

DD* /* Covariant return */ virtual_clone() const override { return new DD( *this ); }

public:

int answer() const { return answer_;}

unique_ptr<DD> /* Apparent covariant return */ clone() const { return up( virtual_clone() ); }

};

#include <iostream> using namespace std;

int main()

{

auto p1 = unique_ptr<DD>(new DD()); auto p2 = p1->clone();

// Correct dynamic type

DD for *p2 is guaranteed by the static type checking.

cout << p2->answer() <<

endl;

// "42"

// Cleanup is automated

via unique_ptr.

 

}

GoalKicker.com – C++ Notes for Professionals

496