Tengo dos preguntas relacionadas con C++:¿Cuál es el significado real de la palabra clave "this"?
En muchos libros de texto, la palabra clave this
es un puntero al objeto llamando. ¿Correcto?
Como me gusta jugar con la codificación, escribí el siguiente código simple:
struct Base
{
void g();
virtual void f();
};
void Base::f() {
cout << "Base::f()" << endl;
}
void Base::g() {
cout << "Base::g()" << endl;
cout << "sizeof(*this) : " << sizeof(*this) << endl;
this->f();
}
struct Derived : public Base
{
int d;
void f();
};
void Derived::f()
{
cout << "Derived::f()" << endl;
}
int main()
{
Base a;
Derived b;
cout << "sizeof(a) : " << sizeof(a) << endl;
cout << "sizeof(b) : " << sizeof(b) << endl;
a.g();
b.g();
}
El código anterior produce la siguiente salida:
sizeof(a) : 4
sizeof(b) : 8
Base::g()
sizeof(*this) : 4
Base::f()
Base::g()
sizeof(*this) : 4 // why 4 bytes not 8 bytes?????????
Derived::f()
Si this
está apuntando al objeto que llama, ¿Debería la segunda línea de sizeof(*this)
imprimir 8 en lugar de 4 dado que el objeto que llama es b
? ¿Qué está pasando realmente aquí? ¿Ha sido degradado this
? !!!!
Si this
se ha degradado al tipo Base
, ¿cómo this->f()
invoca la función correcta? Estoy realmente confundido.
trate de añadir una llamada a sizeof (*) en este Derivado :: f(). Mira lo que pone. La llamada en Base :: g() no sabe que es parte de una subclase. En ese caso, * esto hace referencia legítima a Base, no Derivado. –
y ¿cómo espera que 'sizeof (* this)' se evalúe en tiempo de compilación? No es diferente de 'sizeof (Base)'. –