我有一些訪問派生和基地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
兩個地址完全相同。編譯器是否也存儲一些額外的信息?
編輯: 是的我想說的是,程序在運行時如何知道。
您確實是指「編譯器如何知道」?或者你的意思是「**編譯的代碼**怎麼知道的?」?基本上,你是在談論編譯時還是運行時? –
你的問題的基本答案是「[vtable]」* – paulsm4
*編譯器*通常**不會**知道它所處理的是什麼多態類型,這是多態的一個主要屬性。在運行時,vtable被解析爲指向編譯器可能不知道的東西。 – ssube