class Base
{
public:
int base_int;
};
class Derived : public Base
{
public:
int derived_int;
};
Base* basepointer = new Derived();
basepointer-> //Access derived_int here, is it possible? If so, then how?
Respuesta
No, no se puede acceder derived_int
porque derived_int
es parte de Derived
, mientras basepointer
es un puntero a Base
.
Puede hacerlo al revés sin embargo:
Derived* derivedpointer = new Derived;
derivedpointer->base_int; // You can access this just fine
Las clases derivadas heredan los miembros de la clase base, no al revés.
Sin embargo, si su basepointer
estaba apuntando a una instancia de Derived
entonces se podría acceder a él a través de un reparto:
Base* basepointer = new Derived;
static_cast<Derived*>(basepointer)->derived_int; // Can now access, because we have a derived pointer
Tenga en cuenta que tendrá que cambiar su herencia a public
primera:
class Derived : public Base
¿no debería usar dynamic_cast en lugar de static_cast? –
Eso depende de si él sabe o no que es un 'Derived' o no. Si está 100% seguro (como estamos aquí) entonces 'static_cast' está bien. –
¿no significan todos que reinterpret_cast en lugar de static_cast? Estoy bastante seguro de que static_cast no compilará. – Balk
Estás bailando en el campo minado aquí. La clase base nunca puede saber que en realidad es una instancia del derivado. La forma más segura de hacer eso sería introducir una función virtual en la base:
class Base
{
protected:
virtual int &GetInt()
{
//Die horribly
}
public:
int base_int;
};
class Derived : Base
{
int &GetInt()
{
return derived_int;
}
public:
int derived_int
};
basepointer->GetInt() = 0;
Si los puntos basepointer como algo más que una derivada, su programa morirán horriblemente, que es el resultado previsto.
Alternativamente, puede usar dynamic_cast (basepointer). Pero necesita al menos una función virtual en la Base para eso, y prepárese para encontrar un cero.
El static_cast <>, como algunos sugieren, es una manera segura de dispararse en el pie. No contribuyas a la gran cantidad de historias de horror de "inseguridad de la familia del lenguaje C".
"Alternativamente, puede usar dynamic_cast (basepointer). Pero necesita al menos una función virtual en la base para eso, y prepárese para encontrar un cero". -> Good Point Seva.Liked It :) – mahesh
Usar 'static_cast' no es una forma de dispararte en el pie. Creo que lo estás confundiendo con la notación de lanzamiento explícita de C '(T) x'. 'static_cast' por otro lado es type safe, pero' dynamic_cast' devolverá un puntero nulo si no puede convertirse, mientras que 'static_cast' emitirá un error de compilación. – 0x499602D2
puede utilizar CRTP
que básicamente utiliza la clase derivada de la plantilla para la clase base
Es posible por dejar que la clase base conocen el tipo de clase derivada. Esto se puede hacer haciendo que la clase base sea una plantilla de tipo derivado. Esta expresión C++ se llama curiously recurring template pattern.
Conociendo la clase derivada, el puntero de la clase base se puede convertir estático en un puntero al tipo derivado.
template<typename DerivedT>
class Base
{
public:
int accessDerivedField()
{
auto derived = static_cast<DerivedT*>(this);
return derived->field;
}
};
class Derived : public Base<Derived>
{
public:
int field;
};
int main()
{
auto obj = new Derived;
obj->accessDerivedField();
}
// Si sabe lo que deriva la clase que se va a utilizar
Derivado * derivedpointer = dynamic_cast < Derivado *> basepointer;
// entonces puede acceder a la clase derivada utilizando derivada
- 1. Acceso a un miembro de la clase de base en clase derivada
- 2. Asignar clase derivada de la clase base
- 3. C++ clase base de fundición a la clase derivada lío
- 4. C# inheritance. clase derivada de la clase Base
- 5. Miembro protegido de acceso de una clase en una clase derivada
- 6. Acceso a una propiedad de clase derivada de la clase base en C#
- 7. Convertir clase base a clase derivada
- 8. Accediendo a un miembro/método de una clase derivada virtual
- 9. C# para acceder miembro protegido en la clase derivada
- 10. Impresión del nombre de clase derivada en la clase base
- 11. C# ¿Se puede invocar una propiedad de clase base desde la clase derivada
- 12. Java; clase base de conversión a la clase derivada
- 13. No se puede acceder miembro protegido de la clase base en la clase derivada
- 14. ++ C - "función miembro no declarada" en clase derivada
- 15. error constructor XmlSerializer con clase derivada de una clase base
- 16. Declaración de Acceso Base Clase Método sobrecargado
- 17. ¿Puede una clase base determinar si una clase derivada ha reemplazado a un miembro virtual?
- 18. Acceso a miembros protegidos en una clase derivada
- 19. C++: Con CRTP, clase definida en la clase derivada no es accesible en la clase base
- 20. moldeada ejemplo a base de clase derivada (abatido) en C#
- 21. C++ Problema de acceso de miembro de clase con plantillas
- 22. ¿Por qué una clase de plantilla derivada no tiene acceso a los identificadores de una clase de plantilla base?
- 23. clase derivada Protegida
- 24. Cómo copiar/crear una instancia de clase derivada desde un puntero a una clase base polimórfica?
- 25. Asignación dinámica de clase derivada en C#
- 26. Llamar a un constructor de la clase base desde la clase derivada en Java
- 27. Cómo serializar una clase derivada como su clase base
- 28. C# anidado clase de acceso para padres Miembro
- 29. En Java, ¿cómo invoco el método de una clase base desde el método de anulación en una clase derivada?
- 30. Función derivada de llamada de C++ desde la instancia de clase base
¿Realmente quiere usar herencia privada? –
Alguien le agrega un terminador de enunciado. Cambio solo un carácter. –