使用c ++链接具有父类的子代的方法

时间:2018-03-26 16:19:03

标签: c++ templates chaining crtp fluent-interface

有没有办法从子类链接调用超类而不进行强制转换,重写方法或使用接口。例如。做什么时

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()虚拟?

1 个答案:

答案 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;
}