Есть этот код:
#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» изменяется на виртуальную в производном классе:
virtual void fun(){} // changed in Derived
Тогда адрес this не совпадает в обоих конструкторах:
Base: 0xbf93d6a4
Derived: 0xbf93d6a0
Другое дело, если класс Base полиморфен, например я добавил туда какую-то другую виртуальную функцию:
virtual void funOther(){} // added to Base
затем адреса обоих «этих» снова совпадают:
Base: 0xbfcceda0
Derived: 0xbfcceda0
Вопрос -в том, почему «этот» адрес различается в базовом и производном классе, если базовый класс не полиморфен, а производный класс полиморфен?