向下转换后的 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;
};
我的问题如下:
- 如果我创建一个对象
Derived d(1)
,向上转换为 Base class,然后将其向下转换回 Derived class,是否会保留 'mem==1'?我还能访问它吗?假设使用了指针或引用,因此不会发生对象切片,并且 dynamic_cast 用于向下转换。
- 从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 了吗?
视情况而定;如果将 Derived
对象 转换为 Base
,结果是通过省略不在 Base
中的字段创建的新对象。但是,如果将 pointer 转换为 Derived
(即 Derived*
),结果是指向同一对象但类型为 [=15] 的指针=].
视情况而定;如果你转换 Base
object,你会得到一个编译错误,除非你 overload the typecast operator 做这样的操作(你已经正确地观察到字段的值会否则未定义)。但是,如果将 Base*
( 指针 )转换为 Derived*
(使用 dynamic_cast<Derived*>(p)
),结果取决于指针指向的对象.如果它指向 Derived
class(或其子class)的实例,则结果是指向该对象的 Derived*
指针;否则,你会得到一个 nullptr
类型的指针 Derived*
.
我最近学习了 C++ 中的向上转型和向下转型。但是,在阅读有关向下转换的内容时,我提出了一些问题。假设我有两个 classes
class Base {
public:
virtual void foo() {}
};
class Derived : public Base {
public:
Derived(int i) {
mem = i;
}
int mem;
};
我的问题如下:
- 如果我创建一个对象
Derived d(1)
,向上转换为 Base class,然后将其向下转换回 Derived class,是否会保留 'mem==1'?我还能访问它吗?假设使用了指针或引用,因此不会发生对象切片,并且 dynamic_cast 用于向下转换。 - 从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 了吗?
视情况而定;如果将
Derived
对象 转换为Base
,结果是通过省略不在Base
中的字段创建的新对象。但是,如果将 pointer 转换为Derived
(即Derived*
),结果是指向同一对象但类型为 [=15] 的指针=].视情况而定;如果你转换
Base
object,你会得到一个编译错误,除非你 overload the typecast operator 做这样的操作(你已经正确地观察到字段的值会否则未定义)。但是,如果将Base*
( 指针 )转换为Derived*
(使用dynamic_cast<Derived*>(p)
),结果取决于指针指向的对象.如果它指向Derived
class(或其子class)的实例,则结果是指向该对象的Derived*
指针;否则,你会得到一个nullptr
类型的指针Derived*
.