指针内存表示和继承铸造



当我注意到重新诠释铸件的起作用时,我正在围绕单个/多个继承进行播放,并且在降低指针向对象的降低指针时,在类层次结构中,指向较高的对象,它的基础类型。

我对单词不太好,所以要看我要说的话,请考虑以下代码:

#include <iostream>
#include <string>
class A {
public:
  A (void) {
  }
  virtual ~A (void) noexcept {
  }
  virtual void ABehaviour (void) const {
    std::cout << "Behaviour of Object A implemented in Object A.n";
  } 
};
class B : public A {
public:  
  B (void) 
    : A () {
  }
  ~B (void) noexcept override {
  }
  void ABehaviour (void) const override {
    std::cout << "Behaviour of Object A implemented in Object B.n";
  }
  void BBehaviour (void) const {
    std::cout << "Behaviour of Object B implemented in Object B.n";
  }
};
int main (int arg_count, char* arg_vector[]) {
  B* b_object1 = new B (); // Create an object B.
  b_object1->ABehaviour (); // This line works fine.
  b_object1->BBehaviour (); // This line works fine.
  A* a_object1 = b_object1 // Implicit Upcast to Object A.
  a_object1->ABehaviour (); // This line works fine.
  a_object1->BBehaviour (); // This is a compile time error.
  B* b_object2 = reinterinpret_cast <B*> (a_object1);
  b_object2->ABehaviour (); // This line works fine.
  b_object2->BBehaviour (); // This line works fine.
  delete b_object1;
  b_object1 = nullptr;
  a_object1 = nullptr;
  b_object2 = nullptr;
  return 0;
}

直觉上,上述演员应与呼叫相似,因此应起作用:

B* b_object2 = static_cast <B*> (static_cast <void*> (a_object1));

从我阅读的内容中,Reinterpret_cast是一项编译器指令,它告诉编译器将对象铸造的位置序列解释为对象形成对象铸造的一系列序列。在上述情况下,A*被重新解释为B*。

从很久以前我在C 中参加介绍性课程时所理解的内容是,指针是变量本身,其中包含与其他变量的地址。因此,当执行上述重新诠释铸件时,编译器被告知解释指向A的片段的指针,好像它是B的指针,它是B的片段(不是他们的内容本身)。

所以我的问题是,我的直觉是正确的,还是指针施放有点不同的内部工作。如果我错了,有人会愿意解释如何将指针存储在记忆中,以及它们的铸造在内部(上下和下)如何工作?

对不起文字墙,并提前谢谢大家!

a_object1是指向类型A对象的指针。因此,它只可以访问A的方法。

您对指针的理解也是正确的。指针只拿着它指向的对象的地址。因此,指针本身没有类型。当我说A型指针时,我的意思是指向A(或A的子类)的指针。


A* a_object1 = b_object1与进行static_cast<A*> (b_object1)相同。

如果要调用BBehaviour() A_OBJECT1,则必须进行static_cast<B*>(a_object1)->BBehaviour()。在这种情况下,它将工作起作用,因为尽管a_object1是类型A*,它指向使用运行时类型B*的对象。

static_cast<B*>(a_object1)->BBehaviour()之类的代码是不良设计的标志,因此您要避免这种情况。(如果需要这样做,您将在此处使用dynamic_cast。)

reinterpret_cast<>()可以将任何对象更改为任何其他无关对象。例如:

std::string str = reinterpret_cast<std::string>(a_object1)

会很好地编译,但是在运行时您会遇到问题。

最新更新