2010-05-07 13 views
8
class Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Base"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Derived"; 
    } 
}; 

Derived d; // call Base::foo on this object 

Indicadores de fundición y función intentados, pero no pude hacerlo. ¿Es posible derrotar el mecanismo virtual (solo preguntando si es posible)?Llamada al método virtual desde la clase base en el objeto del tipo derivado

+0

posible duplicado de [Cómo llamar al método de la clase Base a través del puntero de la clase base que apunta a la clase derivada] (http://stackoverflow.com/questions/1136249/how-to-call-base-class-method-through-base -class-pointer-pointing-to-derived-cla) – outis

Respuesta

24

llamar explícitamente la función foo() se define en Base, utilice:

d.Base::foo(); 
+0

+1 para ti también Daniel - extraño para mí, tu respuesta no apareció al principio. – ChrisBD

+1

@ChrisBD: Después de publicarlo, de repente me di cuenta de que no podía recordar haber usado esta construcción directamente (solo dentro de la definición de la función en la clase derivada). Por lo tanto, decidí eliminarlo por un tiempo, hasta que estuve seguro de que funcionó. –

6
d.Base::foo(); 

Tenga en cuenta que llamarían Derived::foo independientemente de si era foo virtual o no.

+0

+1 @Marcelo - eres demasiado rápido para mí :) – ChrisBD

+1

Er ... En realidad, un nombre completo derrota * virtual dispath * específicamente. Parece que está asumiendo que la llamada 'd.foo()' no es virtual. El lenguaje no dice nada de eso. 'd.foo()' call es * virtual * desde el punto de vista del lenguaje, es decir, se resuelve de acuerdo con el tipo dinámico de 'd'. Si su compilador lo distribuye estáticamente, no es más que una optimización realizada por su compilador (porque el tipo dinámico se conoce en tiempo de compilación). Desde el punto de vista del lenguaje, la única forma de evitar el despacho virtual es usar un nombre completo. – AnT

+0

Bueno, esto derrota a ambos. Pero 'b-> Base :: foo' * solo * vence el despacho virtual. –

Cuestiones relacionadas