2009-01-11 16 views
5
#include <iostream> 
using namespace std; 

class Base 
{ 
    public: 
     Base(){cout <<"Base"<<endl;} 
     virtual ~Base(){cout<<"~Base"<<endl;} 
     virtual void foo(){ cout<<"foo base"<<endl;} 
}; 

class Derived: private Base 
{ 
    public: 
     Derived(){cout<<"Derived"<<endl;} 
     virtual ~Derived(){cout<<"~Derived"<<endl;} 
     virtual void foo(){ cout<<"foo dervied"<<endl;} 
}; 


int main(int argc, char *argv[]) 
{ 
    Base *pb = new Derived; 
    Derived d; 
    d.foo(); 
    return 0; 
} 

cuando ejecutar el programa de ejemplo anterior consigo error siguiente: protected.cpp: En función 'int main (int, char **)': protected.cpp: 26: error: " Base' es una base inaccesibles de 'derivado'clase derivada Protegida

¿Por qué no es posible crear objeto derivado con el puntero de base ????


Así que puedo crear una clase derivada de instanse como

Derived d 
Derived d1= new Derived; 

Pero la creación de instancia desde un puntero de clase base como

Base * b = new derived 

fallará.

Esto se debe derivada no es convenientemente indicado una clase derivada de Base cuando derivados procted y privada ??

¿Es esto correcto ?????

+0

¿por qué esta pregunta recibió 3 votos a favor? esa es una pregunta perfectamente legítima. +1, ridículo. – mstrobl

Respuesta

6

Why its not possible to create Derived object with base pointer????

Porque la base es private. Esto explícitamente prohíbe tratar su clase como una instancia Base desde el exterior. Visto desde el exterior, la clase Derived es no una subclase de Base, sólo desde el interior de la propia clase.

Lo mismo vale para la herencia protected, con la única diferencia de que la clase base ya no es privada para la propia clase, sino para cualquier clase derivada también. Para el exterior, sin embargo, se comporta como una herencia privada.

4

Es posible que desee echar un vistazo a this faq en C++ y la herencia. Secciones 24.5 y 24.6 en particular.

0

So I can create an instanse of Derived class like

Derived d Derived d1= new Derived; But creating instance from Base class pointer like

Base * b = new derived will fail.

This is because Derived is not actaully a derived class from Base when derived procted and privately??

Is this correct?????

Es exactamente como Konrad explicó.

que es en realidad todavía derivadas de la base. Para verificar esto, si no anula los métodos virtuales en Derivados, se llamará a las versiones Base.

Sin embargo, puesto que declaró como base protegida el compilador no va a dejar que lances automáticamente una deriva * * a una base porque la superclase Base no es visible externamente.

Cuestiones relacionadas