OOP C++, funciones virtuales y nuevo operador

Tengo que escribir la definición del código a continuación. Entiendo algunos conceptos básicos de OOP Cpp, sé lo que es *x or &x, pero eso no es suficiente... El hecho principal es que no puedo entender la línea B* p = new D, m, *k; no puedo entender que m y *k representar.

class B {
  public: 
    virtual void msg() { cout << "classB"; }
};

class D: public B {
   public: 
     virtual void msg() { cout << "classD"; }
};

int main() {
  B* p = new D, m, *k;
  p->msg(); k = &m; k->msg();
  . . .
}

Ayuda, si puedes explicar cómo (y el porqué entonces) este código funcionará.

gracias por tu tiempo.

preguntado el 27 de julio de 12 a las 22:07

4 Respuestas

Declara múltiples variables a la vez. Esto es básicamente lo mismo que:

B *p = new D;
B  m;
B *k;

So p es un puntero a una instancia de D asignado con nuevo. m es una instancia local de la clase B y k es un puntero a B que luego se asigna para apuntar a m.

La opción msg la función se llama en ambos objetos asignados a través de los punteros p y k.

Tenga en cuenta que * se aplica a cada declaración de variable por separado. Asi que B* a, b; no declara dos punteros, sino que declara un puntero y un objeto local. Esta es la razón por la que muchas personas prefieren escribir el * directamente delante del nombre de la variable: B *a, b hace que esto sea un poco más obvio.

Respondido 27 Jul 12, 22:07

En C++ puede declarar más de una variable en una declaración. Por lo tanto B* p = new D, m, *k; declara las variables p, m y k. * para las declaraciones de puntero se une al nombre de la variable, por lo tanto, es básicamente idéntico a

B* p = new D;
B m;
B* k;

Respondido 27 Jul 12, 22:07

Nada lujoso, es simplemente el viejo C.

B* p = new D, m, *k;

es solo un atajo para:

B* p = new D;
B m;
B* k; 

Respondido 27 Jul 12, 22:07

p es un puntero a un objeto de la clase B (o D, porque es un hijo de la clase B). p->msg(); es parecido a (*p).msg();. m es un objeto de la clase B, por lo que podemos apuntarlo mediante & operador y guárdelo en k (que es un puntero a un objeto de la clase B).

Y

B* p = new D, m, *k;

es sólo

B* p = new D;
B m;
B* k;

Aviso: debes poner * si es necesario cada vez

Respondido el 19 de Septiembre de 12 a las 12:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.