使用 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;
}
有没有一种方法可以在不强制转换、重写方法或使用接口的情况下将子类对超类的调用链接起来。例如。在做
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;
}