Вот такой код:
#include <iostream>
class Base
{
public:
Base() {
std::cout << "Base: " << this << std::endl;
}
int x;
int y;
int z;
};
class Derived : Base
{
public:
Derived() {
std::cout << "Derived: " << this << std::endl;
}
void fun(){}
};
int main() {
Derived d;
return 0;
}
Выход:
Base: 0xbfdb81d4
Derived: 0xbfdb81d4
Однако, когда функция fun изменена на виртуальную в классе Derived:
virtual void fun(){} // changed in Derived
Тогда адрес this в обоих конструкторах не совпадает:
Base: 0xbf93d6a4
Derived: 0xbf93d6a0
Другое дело, если класс Base полиморфен, например, я добавил туда другую виртуальную функцию:
virtual void funOther(){} // added to Base
то адреса обоих 'this' снова совпадают:
Base: 0xbfcceda0
Derived: 0xbfcceda0
Возникает вопрос: почему этот адрес отличается в базовом и производном классе, если базовый класс не полиморфен, а производный класс - нет?
Base
, и он никогда не бывает пустым. - person AnT   schedule 21.07.2012