online ejemplos descargar definicion caracteristicas c++

ejemplos - c++ online



Un puntero de clase base puede apuntar a un objeto de clase derivado. ¿Por qué el viceversa no es verdad? (9)

Un puntero de clase base puede apuntar a un objeto de clase derivado. ¿Por qué el viceversa no es verdad sin lanzar? Lógicamente, una clase base no tendría suficiente información de la clase derivada, pero una clase derivada también debería tener la información de la clase base. Me faltan algunos conceptos básicos aquí.


Dado que C ++ es un lenguaje estáticamente tipado, y que permite conversiones implícitas de base a derivada, se rompería el sistema de tipos. Bjarne Stroustrup no quería ningún error de tiempo de ejecución "mensaje no entendido".


Esto es válido, porque un tigre es un animal:

Animal * pAnimal = new Tiger();

Esto no es válido, porque no es cierto que el objeto sea una rana venenosa.

PoisonDartFrog * pPoisonDartFrog = new GenericFrog();


Porque un puntero de clase base puede apuntar a una instancia de la clase base o cualquier tipo derivado. Un puntero derivado solo puede apuntar a ese tipo derivado o cualquier subclase de él.

struct Base {}; struct Derived : Base {}; struct Derived2 : Base {}; Base* p = new Derived(); //Fine, Derived inherits from Base Derived* d = new Base(); //Not fine, Base is not an instance of nor derived from Derived. Derived* d2 = new Derived2(); // Also not fine, Derived2 derives from Base, but is not related to Derived.

En lo que respecta al por qué: en general, el puntero base es más general que el puntero derivado. Como tal, sabe menos sobre el tipo heredado. A un puntero derivado no se le puede asignar un puntero a un tipo base sin conversión simplemente porque no puede decir si el puntero base es del tipo Derivado o uno de sus hijos.


Porque una clase derivada incluye todo lo que está en la clase base. Pero una clase base no incluye todo lo que está en la clase derivada.

No se recomienda el tipo de conversión de una clase base a una clase derivada: ¿Qué ocurre si intenta acceder a miembros que no forman parte de la clase base?


Si asigna una dirección desde un puntero de clase base a un puntero de clase derivado, puede asignar potencialmente un objeto de clase base a un puntero de clase derivado. Corre el riesgo de acceder a los miembros derivados de la clase cuando no tiene una clase derivada. Mientras que los métodos de clase derivados funcionarían en una clase base, solo lo harían si el método no tuviera acceso a los datos derivados de miembros de la clase.

Eso es un gran riesgo.

Por lo tanto, le obligamos a emitir para que tenga que reconocer la advertencia que dice (puede cometer un error estúpido, tenga cuidado).


Si te digo que tengo un perro, puedes asumir que tengo una mascota.

Si te digo que tengo una mascota, no sabes si ese animal es un perro, podría ser un gato o incluso una jirafa. Sin saber algo de información adicional, no se puede asumir con seguridad que tengo un perro.

del mismo modo, un objeto derivado es un objeto de clase base (ya que es una subclase), por lo que se puede apuntar con un puntero de clase base. Sin embargo, un objeto de clase base no es un objeto de clase derivado por lo que no se puede asignar a un puntero de clase derivado.

(El crujido que escuchará ahora es la analogía de estiramiento)

Supongamos que ahora quiere comprarme un regalo para mi mascota.

En el primer caso, sabes que es un perro, puedes comprarme una correa, todos están felices.

En el segundo caso, no te he dicho cuál es mi mascota, así que si vas a comprar un regalo de todos modos necesitas información que no te he contado (o solo adivinar), me compras una correa, si Resulta que realmente tenía un perro, todos están felices.

Sin embargo, si tuviera un gato, ahora sabemos que hiciste una mala suposición (yeso) y tienes un gato infeliz con una correa (error de tiempo de ejecución).


Tenemos dos objetos.

class A { int a; }; class B : A { int b; };

Asigna una instancia de B Podemos interactuar con eso como A* o B* .

Asigne una instancia de A Si tuviéramos que convertirlo en B* , ¿debería haber espacio asignado para el miembro b ?


Uh, porque la clase base no es una clase derivada.

Cuando tienes un puntero válido para un tipo, entonces estás diciendo que el objeto apuntado tendrá ciertos datos en ciertas ubicaciones para que podamos encontrarlo. Si tiene un puntero a un objeto derivado, entonces está garantizando que el objeto apuntado contiene todos los datos de Derived, pero cuando apunta a una Base, entonces de hecho no tiene eso y Bad Things Happen ™.

Sin embargo, se garantiza que Derived tiene todos los miembros de datos básicos en las mismas ubicaciones. Es por eso que un puntero a Base puede señalar a Derived.


class Base { public: int a; } class Derived : public Base { public: float b; } Base * pBase = new Base(); pBase->a = 7; // setting the value of a in the base // make a pDerived that points to the SAME DATA as pBase Derived * pDerived = pBase; pDerived->a = 5; // this would be okay, base has a public member ''a'' pDerived->b = 0.2f; // error pBase has no data member b and pDerived // points to the SAME DATA as pBase