c ++是否像奇怪的反复出现的模板模式一样保证将祖母基类降级为盛大的子类?

时间:2016-01-03 04:03:45

标签: c++ downcast

我想知道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

1 个答案:

答案 0 :(得分:6)

鉴于您提供的代码,是的,该标准要求允许这样做。只要您正确使用CRTP,标准就要求它能够正常工作。即使其他课程介于两者之间。

请注意,基类也可以访问中产阶级的任何公共成员。如果名称冲突,最顶级的类会覆盖它。

另外,请注意,传递最派生类和传递第一个派生类之间存在概念上的区别。基类只能(直接)访问您传入的类。因此,如果您只传入第一个派生类,如果该类本身使用CRTP及其派生类,则您的基类将不会知道它。然而,如果您传递最派生的类,它可以访问最派生的类和中间的任何公共接口。

您想要使用的取决于您想要的效果。