用C ++ ISO标准解释对基址的反引用指针

Lav*_*ven 1 c++ standards iso pointers dereference

我想了解标准关于将指针解引用到基的观点,但是我在寻找它方面没有任何进展。以这两个类为例:

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?
}
Run Code Online (Sandbox Code Playgroud)

因此,基本上,如果取消引用指向类型D的对象的类型B的指针,切片会在适当的位置发生,还是会临时出现?我倾向于认为临时不是一个选择,因为这意味着临时是抽象类的实例。

不管真相如何,我都希望能有一个指向ISO标准的指针。(或者第三,就此而言。:))

编辑:

我提出的观点是,暂时不作为一种选择,因为它可能会以其行为方式行事,这是很合逻辑的,但我无法在标准中找到确认,而且我也不是普通读者。

编辑2:

通过讨论,很明显,我的问题实际上是关于取消引用指针机制的,而不是关于拼接或临时的。我感谢每个人都为我做的愚蠢,最后我得到了最令我困惑的问题的答案:为什么我找不到标准的东西……显然这是错误的问题,但是我有正确的答案。

n

Naw*_*waz 5

Base &b = *static_cast<Base *>(d); // does this work by standard?
Run Code Online (Sandbox Code Playgroud)

是。

但是您可以简单地做到这一点:

Base &b = *d;

//use b polymorphically!
b.do_something(); //calls Derived::do_something()
Run Code Online (Sandbox Code Playgroud)

无需使用static_cast。毕竟Derived是从派生的Base


回复您的编辑:

foo2(d); // does this work by standard?
Run Code Online (Sandbox Code Playgroud)

是。Base*可以使用type的指针来初始化type的指针Derived*

-

Base &b = *b; // how this work by standard?
Run Code Online (Sandbox Code Playgroud)

不,他们是同一个名字。如果您的意思Base &b1 = *b是,那么可以。b1指由指向的对象b