C++中无需强制转换等操作,子类调用父类方法后能否链式调用?
解决方案:利用CRTP实现无额外操作的链式调用
嘿,这个问题其实有个非常巧妙的解法——奇异递归模板模式(CRTP),完全满足你提出的「无需强制转换、重写方法或使用接口」的要求。
核心思路
让父类通过模板参数知晓子类的类型,这样父类的方法就能直接返回子类的引用,而不是父类自身的引用,从而自然支持后续的子类方法链式调用。
修改后的代码示例
template<typename Derived> class A { public: Derived& foo() { // 安全的静态转换:当前对象必然是Derived类型的实例 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; }
为什么这样可行?
- 当子类
B继承A<B>时,父类A中的foo()方法返回类型变为B&,调用b.foo()后得到的是B类型的引用,因此可以直接调用B的bar()方法。 - 这里的
static_cast是绝对安全的,因为我们在继承时明确绑定了父类和子类的关系,*this肯定是Derived(即B)类型的对象实例。 - 整个过程既不需要强制转换,也不需要重写父类的
foo()方法,更无需额外定义接口,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

