Ковариантный тип возврата в C++
У виртуального метода базы возвращаемый тип в потомке может сузиться до типа потомка - это называют ковариантным возвратом.
Типичный пример - фабричный метод
clone: в базе он возвращает
Base*, а в потомке -
Derived* с ключевым словом
override. У полиморфной базы
деструктор остается виртуальным, чтобы
удаление через указатель на базу не
срезало объект. Запишем пару классов
и выведем адрес клона:
┌pPathX="main.cpp"
#include <iostream>
class Document {
public:
virtual Document* clone() {
return new Document(*this);
}
virtual ~Document() = default;
};
class Report : public Document {
public:
Report* clone() override {
return new Report(*this);
}
};
int main() {
Report original;
Document* copy = original.clone();
std::cout << copy << "\n";
delete copy;
return 0;
}
Сделайте Shape с виртуальным
clone и Dot с
ковариантным переопределением. Создайте
Dot, получите клон через
указатель Shape* и освободите
память через этот указатель.