2011-04-10 8 views
8

asumir el siguiente caso sencillo (nótese la ubicación de virtuales)C++: ¿Es "virtual" heredada a todos los descendientes

class A { 
    virtual void func(); 
}; 

class B : public A { 
    void func(); 
}; 

class C : public B { 
    void func(); 
}; 

¿La siguiente llamada de la llamada B::func() o C::func()?

B* ptr_b = new C(); 
ptr_b->func(); 
+2

sí, declarar un método como marcas virtuales todos sus descendientes virtuales – knittl

Respuesta

6

ejemplos que utilizan punteros así como una referencia.

  • Usando el puntero

    B *pB = new C(); 
    pB->func(); //calls C::func() 
    
    A *pA = new C(); 
    pA->func(); //calls C::func() 
    
  • Usando como referencia. Tenga en cuenta la última llamada: la llamada más importante.

    C c; 
    B & b = c; 
    b.func(); //calls C::func() 
    
    //IMPORTANT - using reference! 
    A & a = b; 
    a.func(); //calls C::func(), not B::func() 
    

Demo Online: http://ideone.com/fdpU7

7
  1. Su código es inválido C++. ¿Cuáles son los paréntesis en la definición de la clase?
  2. Depende del tipo dinámico del objeto apuntado por pointer_to_b_type.
  3. Si entiendo lo que realmente quiere preguntar, entonces 'Sí'. Esto requiere C::func:

    C c; 
    B* p = &c; 
    p->func(); 
    
+0

@Amir: él está pidiendo pregunta sí/no. – Nawaz

+0

@Amir: "Es" Virtual "heredado de todos los descendientes" me suena como una pregunta sí/no. – Xeo

+0

@Amir: ¿en serio? Siempre he pensado que las preguntas de la forma "Es ..." y "Sería ..." son preguntas sí/no. – ybungalobill

3

llama a la función en la clase que usted se refiere. Sin embargo, funciona hasta arriba si no existe.

Prueba el siguiente código:

#include <iostream> 
using namespace std; 

class A { 
    public: 
    virtual void func() { cout << "Hi from A!" << endl; } 
}; 

class B : public A { 
    public: 
    void func() { cout << "Hi from B!" << endl; } 
}; 

class C : public B { 
    public: 
    void func() { cout << "Hi from C!" << endl; } 
}; 

int main() { 
    B* b_object = new C; 
    b_object->func(); 
    return 0; 
} 

Esperanza esto ayuda

+0

Disculpas por eso, lo extrañé por completo en su publicación. Enmendado Mi respuesta sigue en pie;) –

+0

Sí, ahora está bien. – Xeo

Cuestiones relacionadas