使用 C++ 将子项与父项 类 链接起来的方法

method chaining child with parent classes using c++

有没有一种方法可以在不强制转换、重写方法或使用接口的情况下将子类对超类的调用链接起来。例如。在做

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 return 引用了自己),但我希望它 return 它是类型 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;
}