【发布时间】:2013-03-28 18:26:00
【问题描述】:
我有一些代码可以访问派生和基础 ptr,当我打印出地址时,它们是相同的。如果是这种情况,编译器如何知道它所引用的地址是 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
两个地址完全相同。编译器是否也存储了一些额外的信息?
编辑: 是的,我的意思是说程序在运行时是如何知道的。
【问题讨论】:
-
你真的是说“编译器是怎么知道的”吗?或者你的意思是“编译后的代码是怎么知道的?”?基本上,您是在谈论编译时还是运行时?
-
您的问题的基本答案是“vtable”
-
编译器通常不知道它所处理的多态类型,这是多态的主要属性。在运行时,vtable 被解析为指向编译器可能不知道的东西。
-
@user619818 - Oli Charlesworth 和 peachykeen 指出“编译时”和“运行时”之间存在差异。运行时多态性通过“虚拟”方法(“编译时”事物)表达,并通过“vtables”(“运行时事物”)实现。 '希望对您有所帮助...
标签: c++ pointers polymorphism