我想知道c ++是否保证将祖母基类降级为盛大的子类,就像奇怪的重复模板模式一样。 以下代码在我的环境中运行良好。但是我不确定它是否适用于任何条件/环境。 请告诉我你的了解。 非常感谢你。
PS。老实说,我不确定我的方式要求堆栈溢出是好还是坏。如果您发现了坏点,请告诉我。再次感谢你。
#include <iostream>
template <typename GrandChild>
class GrandBase {
public:
void print(void) {
const GrandChild* grand_child = static_cast<const GrandChild*>(this);
std::cout << "GrandChild::value = " << grand_child->grand_child_value << std::endl;
}
};
template <typename Derived>
class BridgeClass : public GrandBase<Derived> {};
class GrandChild : public BridgeClass<GrandChild> {
public:
GrandChild() = default;
virtual ~GrandChild() = default;
int grand_child_value = 17;
};
void test_down_casting_to_grand_base(void) {
GrandChild a;
a.print();
}
int main(int argc, char **argv) {
test_down_casting_to_grand_base();
return 0;
}
输出
GrandChild::value = 17
答案 0 :(得分:6)
鉴于您提供的代码,是的,该标准要求允许这样做。只要您正确使用CRTP,标准就要求它能够正常工作。即使其他课程介于两者之间。
请注意,基类也可以访问中产阶级的任何公共成员。如果名称冲突,最顶级的类会覆盖它。
另外,请注意,传递最派生类和传递第一个派生类之间存在概念上的区别。基类只能(直接)访问您传入的类。因此,如果您只传入第一个派生类,如果该类本身使用CRTP及其派生类,则您的基类将不会知道它。然而,如果您传递最派生的类,它可以访问最派生的类和中间的任何公共接口。
您想要使用的取决于您想要的效果。