从(对基对象的基引用)到(派生 Class 引用)的静态转换
Static Cast from ( Base Reference to Base Object ) to ( Derived Class Reference)
在下面的 main
函数中,第一个 static_cast
是有效的,因为我正在尝试转换一个(基础 class 对 Derived1
class 的引用) 派生引用
但是为什么第二个 cast 打印了这些值,尽管它打印了 d2.y
的垃圾值,我认为这应该是一个警告或编译错误。
对基础对象拾取的基础引用如何导出 class 的值(d2.y
在这种情况下,我也可以为其赋值)
谁能解释一下这两种情况下发生了什么。
class Base1
{
public:
Base1()
{
x = 999;
}
int x;
};
class Derived1: public Base1
{
public:
Derived1()
{
y = 1000;
}
int y;
};
int main()
{
Derived1 d;
std::cout << d.x << " " << d.y << std::endl;
Base1& b = d;
Base1 b1;
Base1 & b2 = b1;
Derived1& d1 = static_cast<Derived1&>(b);
Derived1& d2 = static_cast<Derived1&>(b2);
std::cout << d1.x << " " << d1.y << std::endl;
std::cout << d2.x << " " << d2.y << std::endl;
return 0;
}
A static_cast
是您对编译器的承诺,即基础 class 确实是派生的 class —— 计算机无需仔细检查。你告诉编译器,作为程序员,你知道一些编译器无法知道的事情,这保证了这是真的。因此,当 CPU 指令访问派生类型成员所在的内存地址处的值时,它会进入一些可以包含几乎所有内容的内存,就像你告诉它的那样.
除了非常简单的情况,编译器无法知道对基类型的引用到底有什么。这就是 dynamic_cast 存在的原因(但它需要额外的信息——vtable——才能进行检查)。
如果两个类型不可能相关,static_cast
将导致编译时错误,但如果它们在同一个继承链中,您可以用无效的 static_cast
做各种坏事。
当您开始将 C/C++ 类型视为内存偏移量的简单定义时,许多行为和语法要求开始变得更有意义。
在下面的 main
函数中,第一个 static_cast
是有效的,因为我正在尝试转换一个(基础 class 对 Derived1
class 的引用) 派生引用
但是为什么第二个 cast 打印了这些值,尽管它打印了 d2.y
的垃圾值,我认为这应该是一个警告或编译错误。
对基础对象拾取的基础引用如何导出 class 的值(d2.y
在这种情况下,我也可以为其赋值)
谁能解释一下这两种情况下发生了什么。
class Base1
{
public:
Base1()
{
x = 999;
}
int x;
};
class Derived1: public Base1
{
public:
Derived1()
{
y = 1000;
}
int y;
};
int main()
{
Derived1 d;
std::cout << d.x << " " << d.y << std::endl;
Base1& b = d;
Base1 b1;
Base1 & b2 = b1;
Derived1& d1 = static_cast<Derived1&>(b);
Derived1& d2 = static_cast<Derived1&>(b2);
std::cout << d1.x << " " << d1.y << std::endl;
std::cout << d2.x << " " << d2.y << std::endl;
return 0;
}
A static_cast
是您对编译器的承诺,即基础 class 确实是派生的 class —— 计算机无需仔细检查。你告诉编译器,作为程序员,你知道一些编译器无法知道的事情,这保证了这是真的。因此,当 CPU 指令访问派生类型成员所在的内存地址处的值时,它会进入一些可以包含几乎所有内容的内存,就像你告诉它的那样.
除了非常简单的情况,编译器无法知道对基类型的引用到底有什么。这就是 dynamic_cast 存在的原因(但它需要额外的信息——vtable——才能进行检查)。
如果两个类型不可能相关,static_cast
将导致编译时错误,但如果它们在同一个继承链中,您可以用无效的 static_cast
做各种坏事。
当您开始将 C/C++ 类型视为内存偏移量的简单定义时,许多行为和语法要求开始变得更有意义。