Тема: Error C2555: overriding virtual function return type differs...
Хочу поділитися сюрпризами, які видає Visual C++ 2013, і за одно спитати, якого лисого вона так робить.
Спочатку постановка задачі, яку я виконую на C++:
Створити 3 класи вузлів, де:
одні будуть містити вказівник на наступний елемент;
другі будуть містити вказівники на наступний і попередній елементи;
треті будуть містити ті самі вказівники що і другі, але не будуть дорівнювати 0 (NULL, nullptr), тобто по замовчуванню вказуватимуть на себе.
+ Кожен з вузлів має містити якісь дані (але це не має відношення до проблеми).
Ну я, як і всякий нормальний програміст, почав ліпити з цих 3-х класів ієрархію (в прикріпленому архіві оригінальні файли мого рішення). В кожному класі я створив публічні віртуальні методи, які повертають вказівники на інші елементи, і типи цих вказівників, є такими ж як клас, в якому ці методи описані.
Наслідування вирішив зробити не публічним (public), і навіть не захищеним (protected), а закритим (private), щоб ніхто, крім безпосереднього нащадка, не мав доступу до методів, які працюють з вказівниками типу предка.
Також поставив const після імен функцій, які не змінюють значення полів класів.
Ось дуже спрощений приклад, який не позбавлений суті проблеми:
class Node {
private:
Node *next;
public:
virtual Node *const GetNext() const { return next; }
};
class DualNode : private Node {
private:
DualNode *prev;
public:
virtual DualNode *const GetNext() const { return static_cast<DualNode *>(Node::GetNext()); }
virtual DualNode *const GetPrev() const { return prev; }
};
class ExtendedNode : private DualNode {
public:
virtual ExtendedNode *const GetNext() const { return static_cast<ExtendedNode *>(DualNode::GetNext()); }
virtual ExtendedNode *const GetPrev() const { return static_cast<ExtendedNode *>(DualNode::GetPrev()); }
};
Cпробував скомпілювати це добро і отримав:
error C2555: 'ExtendedNode::GetNext': overriding virtual function return type differs and is not covariant from 'DualNode::GetNext'.
Я навіть не знаю як сформулювати питання, це ж просто "WTF?".
Як мені залишити private-наслідування, virtual-const-функції, і позбутися помилки ?