gpt4 book ai didi

c++ - c++ 是否像奇怪的重复模板模式一样保证将祖母基类向下转换为孙子类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:42 27 4
gpt4 key购买 nike

我想知道 c++ 是否像奇怪的重复模板模式一样保证将祖母基类向下转换为孙子类。 以下代码在我的环境中运行良好。但是我不确定它是否适用于任何条件/环境。 请告诉我你所知道的。 非常感谢。

附言。老实说,我不确定我询问堆栈溢出的方式是好是坏。如果您发现不好的地方,请告诉我。再次感谢。

#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

最佳答案

鉴于您提供的代码,是的,标准要求允许这样做。只要正确使用 CRTP,标准就要求它可以工作。即使中间还有其他类(class)。

但是请注意,基类也可以访问中间类的任何公共(public)成员。当然,如果名称冲突,最顶层的类会覆盖它。

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

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

关于c++ - c++ 是否像奇怪的重复模板模式一样保证将祖母基类向下转换为孙子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com