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
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。