c++ - 从(基对象的基引用)到(派生类引用)的静态转换

标签 c++ c++11 downcast

在下面的 main 函数中,第一个 static_cast 是有效的,因为我正在尝试转换一个(对 Derived1 类的基类引用)派生引用 但是为什么第二个 cast 打印值,虽然它打印了 d2.y 的垃圾值,我认为它应该是警告或编译错误。 对基对象的基引用如何选择派生类的值(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;     
}

最佳答案

static_cast 是您对编译器的 promise ,即基类确实是派生类——不需要计算机进行双重检查。你告诉编译器,作为程序员,你知道一些编译器无法知道的事情,这保证了这是真的。因此,当指示 CPU 访问派生类型成员应该所在的内存地址处的值时,它会进入一些内存,该内存可以包含几乎所有内容,就像您告诉它的那样。

除了非常简单的情况,编译器无法知道对基类型的引用到底有什么。这就是存在 dynamic_cast 的原因(但它需要额外的信息——vtable——才能进行检查)。

如果两种类型不可能相关,

static_cast 将导致编译时错误,但如果它们在同一个继承链中,您可以使用无效的 static_cast< 做各种坏事.

当您开始将 C/C++ 类型视为内存偏移量的简单定义时,许多行为和语法要求开始变得更有意义。

关于c++ - 从(基对象的基引用)到(派生类引用)的静态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39539860/

相关文章:

c++ - C++ 程序中的 "Does not refer to value"错误

c++ - selfcreates 类数组 [2] 导致问题

c++ - 进行指针运算的规则

c++ - 初始化虚拟继承层次结构

java - 试图在java中将对象向下转换为文件

c# - 如何向下转换为重载方法

Java传递变量——向下转型

c++ - 构造类的性能问题,C++

c++ - 动态更改文本 qlabel

c++ - 一个人如何降低 std::shared_ptr?