Есть ли способ связать вызовы суперкласса из подкласса без приведения, переопределения метода или использования интерфейсов. Например. когда делаешь
class A {
public:
A& foo() { return *this; }
};
class B : public A {
public:
B& bar() { return *this; }
};
int main(void) {
B b;
b.foo().bar();
return 0;
}
При компиляции с clang я получаю ошибку
main.cpp:13:10: error: no member named 'bar' in 'A'
b.foo().bar();
~~~~~~~ ^
1 error generated.
Что я могу понять почему (поскольку A возвращает ссылку на себя), но я бы хотел, чтобы он возвращал свой подкласс типа B, поскольку он вызывается в этом контексте. Это возможно? Или мне нужно определить B как
class B : public A {
public:
B& bar() { return *this; }
B& foo() { A::foo(); return *this; }
};
и сделать foo () виртуальным?
Ты можешь использовать CRTP шаблон:
template<class Derived>
class A {
public:
Derived& foo() { return *static_cast<Derived*>(this); }
};
class B : public A<B> {
public:
B& bar() { return *this; }
};
int main(void) {
B b;
b.foo().bar();
return 0;
}
Других решений пока нет …