gpt4 book ai didi

C++ ISO 对指向基的解除引用指针的标准解释

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:26 25 4
gpt4 key购买 nike

我想知道标准对取消引用指向基的指针的看法,但我在寻找它方面没有取得任何进展。以这两个类为例:

class Base
{
public:
virtual void do_something() = 0;
};

class Derived : public Base
{
public:
virtual void do_something();
};

void foo2(Base *b)
{
Base &b1 = *b; // how this work by standard?
}

void foo()
{
Derived *d = new Derived();
foo2(d); // does this work by standard?
}

所以,基本上,如果指向 D 类型对象的 B 类型指针被解除引用,切片会就地发生,还是会出现临时对象?我倾向于认为 temporary 不是一个选项,因为这意味着 temporary 是抽象类的实例。

无论事实如何,我将不胜感激任何指向 ISO 标准的指示。 (或者第三,就此而言。:))

编辑:

我提出暂时不能作为一种可能的推理方式来说明它为什么会这样,这很合乎逻辑,但我找不到标准的确认,而且我不是普通读者.

编辑2:

通过讨论,很明显我的问题实际上是关于取消引用指针机制,而不是关于拼接或临时对象。我感谢大家试图为我简化它,我终于得到了最让我困惑的问题的答案:为什么我在标准中找不到关于这个的任何内容......显然这是错误的问题,但我得到了正确的答案。

感谢

最佳答案

Base &b = *static_cast<Base *>(d); // does this work by standard?

是的。

但你可以简单地这样做:

Base &b = *d;

//use b polymorphically!
b.do_something(); //calls Derived::do_something()

无需使用static_cast。毕竟,Derived 派生自 Base


回复您的编辑:

foo2(d); // does this work by standard?

是的。 Base* 类型的指针可以用Derived* 类型的指针初始化。

--

Base &b = *b; // how this work by standard?

没有。他们同名。如果您的意思是 Base &b1 = *b,那么可以。 b1指的是b指向的对象。

关于C++ ISO 对指向基的解除引用指针的标准解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7420314/

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