向下转换后的 C++ derived-class 成员

C++ derived-class members after downcasting

我最近学习了 C++ 中的向上转型和向下转型。但是,在阅读有关向下转换的内容时,我提出了一些问题。假设我有两个 classes

class Base {
  public:
    virtual void foo() {}
};

class Derived : public Base {
  public:
    Derived(int i) {
        mem = i;
    }
    int mem;
};

我的问题如下:

  1. 如果我创建一个对象 Derived d(1),向上转换为 Base class,然后将其向下转换回 Derived class,是否会保留 'mem==1'?我还能访问它吗?假设使用了指针或引用,因此不会发生对象切片,并且 dynamic_cast 用于向下转换。
  2. 从Baseclass向下转型到Derivedclass时,会多出一个成员变量'mem'。 运行 期间(使用 dynamic_cast)是否为 'mem' 分配了内存?它将被初始化为什么值?

经过一些简单的实验,1 似乎是正确的。

但是对于 2,我似乎无法从 Base class 指针开始并将其 dynamic_cast 转换为 Derived class 指针作为 dynamic_cast returns空。

我从另一个 post 那里读到说“但是 dynamic_cast 的基本要点是它首先检查指针对象是否确实是派生类型,然后 returns 指向它的指针,或者 returns 如果指针对象实际上不是(或派生自)请求的目标类型,则为空指针。"

这是不是说我们实际上不能从 Base class 开始并将其简单地向下转换为 Derived class,而是 dynamic_cast 的全部要点是“向后转换” " 有什么东西被 upcast 了吗?

  1. 视情况而定;如果将 Derived 对象 转换为 Base,结果是通过省略不在 Base 中的字段创建的新对象。但是,如果将 pointer 转换为 Derived(即 Derived*),结果是指向同一对象但类型为 [=15] 的指针=].

  2. 视情况而定;如果你转换 Base object,你会得到一个编译错误,除非你 overload the typecast operator 做这样的操作(你已经正确地观察到字段的值会否则未定义)。但是,如果将 Base* 指针 )转换为 Derived*(使用 dynamic_cast<Derived*>(p)),结果取决于指针指向的对象.如果它指向 Derived class(或其子class)的实例,则结果是指向该对象的 Derived* 指针;否则,你会得到一个 nullptr 类型的指针 Derived*.