Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
500 of 696 menu
◀ ▶

Ковариантный тип возврата в 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* и освободите память через этот указатель.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить