有没有办法从子类链接调用超类而不进行强制转换,重写方法或使用接口。例如。做什么时
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返回对self的引用),但我希望它返回它的子类B类,因为它在该上下文中被调用。这可能吗?或者我需要将B定义为
class B : public A {
public:
B& bar() { return *this; }
B& foo() { A::foo(); return *this; }
};
并使foo()虚拟?
答案 0 :(得分:6)
您可以使用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;
}