c++ - 编译器如何确定它正在寻址哪种多态类型

标签 c++ pointers polymorphism

我有一些访问派生指针和基指针的代码,当我打印出地址时,它们是相同的。如果是这种情况,编译器如何知道它所引用的地址是A还是B?

这是代码:

#include <iostream>

class A
{
public:
   A() : val_(0) {
       ptrA = this;
   }

   virtual void set(int val) { val_ = val; }

   virtual void printval() = 0;

   static A* ptrA;

   int val_;
};

class B : public A
{
public:
   B() : A() {
      ptrB = this;
   }

   virtual void printval() { std::cout << A::val_ << std::endl; }

   static B* ptrB;
};

A* A::ptrA = 0;
B* B::ptrB = 0;

int main() {

   A* p = new B();
   p->set(3);
   p->printval();

   std::cout << "A part address=" << A::ptrA << std::endl;
   std::cout << "B part address=" << B::ptrB << std::endl;

   return 0;
}

这是打印输出:

A part address=00501F40
B part address=00501F40

两个地址完全相同。编译器是否还存储一些额外的信息?

编辑: 是的,我的意思是程序在运行时如何知道。

最佳答案

通过依赖于实现的机制内置额外信息。当您编译程序时,编译器会悄悄地添加簿记所需的所有代码。
对于几乎所有编译器来说,动态调度都是通过虚拟表和指针来实现的。

食物阅读:

<强> What happens in the hardware when I call a virtual function? How many layers of indirection are there? How much overhead is there?

关于c++ - 编译器如何确定它正在寻址哪种多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15689452/

相关文章:

C++ 指向类名的指针数组

c++ - "upcast"方法指针并将其与基类指针一起使用是否安全?

c++ - 我如何用 C 中的按位或其他高效代码实现逻辑蕴涵?

c++ - 如何将 Windows 资源管理器与 Windows 命令提示符同步?

c++ - 从 const 指针创建用户类的 const 对象

c++ - 有没有比使用 dynamic_cast 更快的在运行时检测对象类型的方法?

c++ - 将派生对象存储在基本类型的 vector 中

c++ - 在使用Qt 5.9.4的Fedora上,我无法同时记录和播放音频

c++ - 使用 Qt 制作几乎原生的 Windows 应用程序?

c++ - 使用指针输入字符串的一些问题