派生およびベースptrsにアクセスするコードがいくつかあり、アドレスを出力すると、それらは同じです。この場合、コンパイラは、参照しているアドレスが 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
どちらのアドレスもまったく同じです。コンパイラは追加情報も保存しますか?
編集:はい、プログラムが実行時にどのように知っているかを言うつもりでした。