我有一些访问派生指针和基指针的代码,当我打印出地址时,它们是相同的。如果是这种情况,编译器如何知道它所引用的地址是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
两个地址完全相同。编译器是否还存储一些额外的信息?
编辑: 是的,我的意思是程序在运行时如何知道。
最佳答案
通过依赖于实现的机制内置额外信息。当您编译程序时,编译器会悄悄地添加簿记所需的所有代码。
对于几乎所有编译器来说,动态调度都是通过虚拟表和指针来实现的。
食物阅读:
关于c++ - 编译器如何确定它正在寻址哪种多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15689452/