Pregunta

en C de struct, estoy garantizado que:

struct Foo { ... };
struct Bar {
  Foo foo;
  ...
}
Bar bar;
assert(&bar == &(bar.foo));

Ahora, en C ++, si tengo:

class Foo { ... };
class Bar: public Foo, public Other crap ... {
  ...
}

Bar bar;
assert(&bar == (Foo*) (&bar)); // is this guaranteed?

Si es así, ¿me puede dar una referencia (como "El lenguaje de programación C ++, página XYZ")?

Gracias!

¿Fue útil?

Solución

No hay ninguna garantía. Desde el C ++ 03 estándar (10/3, class.derived):

  

El orden en que los subobjetos clase base se asignan en el objeto más derivado (1.8) está especificado.

Otros consejos

A pesar de que el diseño de las clases base es no garantizados en la forma en que parecen haber sido el pensamiento (ya pesar de que hay más garantías para los miembros), esto está garantizado:

Bar bar;
assert(&bar == (Foo*) (&bar));

Debido a que el fundido utiliza un static_cast (por 5,4) que convertirá &bar correctamente, y la comparación entre puntero a base y-puntero a derivados convertirá de manera similar.

Esto, sin embargo, no se garantiza:

Bar bar;
void* p1 = &bar;
void* p2 = (Foo*)&bar;
assert(p1 == p2); // not guaranteed

no me imagino que sería, no sé por qué tendría que ser.

Tengo una pregunta relacionada.

Si usted tiene la herencia de diamante:

class Base(){ virtual void AFunc(){}  };

class A:Base{};
class B:Base{void AFunc(){} }

class Test:A,B{};


Base * b = (Base*)new Test;

b->AFunc();

permite suponer que la estructura de la memoria es la base de: A: B: Prueba,

nota en el punto de llamar, todo el compilador sabe es la dirección del inicio del objeto, y AFunc está a la espera de ser en relación con el inicio del objeto B, estas dos direcciones no serán lo mismo! Entonces, ¿cómo funciona?

Al igual que si B era de tipo B, las dos direcciones serían los mismos ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top