El tipo de devolución de una función virtual debe ser del mismo tipo que está en la clase base o covariante. Pero, ¿por qué tenemos esta restricción?Tipo de devolución diferente para funciones virtuales
Respuesta
Porque, ¿cómo volvería el código que usa el valor de retorno a todo tipo de tipos no relacionados? ej .:
class A
{
public:
virtual float func();
};
class B: public A
{
public:
virtual char *func();
};
A *p = (some_condition) ? new A() : new B();
p->func(); // Oh no! What is the type?
Sí, tipo no relacionado = malo. ¿Qué pasa con otros tipos relacionados? – curiousguy
Debido a las tonterías que se derivarían:
struct foo
{
virtual int get() const { return 0; }
};
struct bar : foo
{
std::string get() const { return "this certainly isn't an int"; }
};
int main()
{
bar b;
foo* f = &b;
int result = f->get(); // int, right? ...right?
}
No es conveniente contar con un retorno clase derivada algo totalmente sin relación.
Discusión [se trasladó al chat.] (Http://chat.stackoverflow.com/rooms/15288/discussion-between-gmannickg-and-curiousguy) – GManNickG
Conclusión del chat: ** GManNickG admite que la regla actual de C++ que solo permite que los punteros (o referencias) se puedan relajar. ** – curiousguy
No es un "admitir", nunca lo negé en primer lugar ... – GManNickG
Según C++ estándar:
El tipo de retorno de una función primordial será, o bien idéntica al tipo de retorno de la anulado ción fun- o covariante con las clases de las funciones. Si una función D :: f anula una función B :: f, los tipos de retorno de las funciones son covariantes si cumplen los siguientes criterios:
1) ambos son punteros a clases o referencias a clases
2) la clase en el tipo de devolución de B :: f es la misma clase que la clase en el tipo de devolución de D :: f, o es una clase base directa o indirecta no ambigua y accesible de la clase tipo de devolución de D :: f
3) ambos punteros o referencia tienen la misma calificación de cv y el tipo de clase en el tipo de devolución de D :: f tiene la misma calificación cv o menos cv-qualification que el tipo de clase en el tipo de devolución de B :: f.
La pregunta ya supone la restricción, pregunta por qué existe esta restricción. – GManNickG
La respuesta es muy similar a la dada por "Why can't I assign a vector<Apple*> to a vector<Fruit*>?" el FAQ de Bjarne Stroustrup.
La capacidad de modificar el tipo de devolución daría lugar a un agujero en el tipo de seguridad del lenguaje (ver la respuesta de @GManNickG para un ejemplo específico) cuando se trata de tipos polimórficos.
Hay una situación bastante común cuando afectar el tipo de retorno sería ideal: al devolver un puntero polimórfico de un método virtual de un tipo base. Por ejemplo,
class Base {
public:
virtual Base* parent() = 0;
};
class Child : public Base {
public:
Base* parent() override
{
return parent_;
}
private:
Parent* parent_; // Assume `Parent` type exists.
};
Aquí se pierde la información de tipo que sabe de Child
es parent_
miembro. Esto conduce a una gran cantidad de fundición, a pesar de que el tipo estaba en un punto bien definido. Podemos resolver esto utilizando el lenguaje Curiously Recurring Template Parameter (CRTP),
template<class ParentType>
class Base {
public:
virtual ParentType* parent()
{
return parent_;
}
private:
ParentType* parent_;
};
class Child : public Base<Parent> {
};
"_La respuesta es muy similar a la de" ¿Por qué no puedo asignar un vector
- 1. Evitar funciones virtuales
- 2. C++ Implementación de funciones virtuales?
- 3. C++: funciones virtuales privadas, frente a las funciones virtuales puras
- 4. anulación de funciones no virtuales
- 5. con funciones virtuales
- 6. encasillamiento con funciones virtuales
- 7. ¿Cómo establecer la alineación para funciones virtuales?
- 8. funciones virtuales de objetos rebanar
- 9. Sobrecarga con diferente tipo de devolución en Java?
- 10. Funciones virtuales y rendimiento C++
- 11. funciones virtuales estáticos en C++
- 12. ¿Por qué usar funciones virtuales?
- 13. funciones virtuales en C Objetivo
- 14. ¿Por qué las funciones virtuales en C++ se llaman 'virtuales'?
- 15. Herencia de diamantes y funciones virtuales puras
- 16. Variable de referencia y funciones virtuales
- 17. Reenvío perfecto: a través de funciones virtuales
- 18. Requerir funciones virtuales anuladas para llamar a implementaciones base
- 19. Tipo de devolución vararg?
- 20. Uso de los parámetros de tipo de subclase en funciones virtuales
- 21. ¿Por qué Scala requiere un tipo de devolución para funciones recursivas?
- 22. Funciones de devolución de las funciones de PowerShell
- 23. funciones de devolución de llamada de escritura
- 24. Tipo de retorno Scala para funciones tuple
- 25. Advertencias para funciones sin especificaciones de tipo?
- 26. ¿C++ permite tipos de devolución por defecto para las funciones?
- 27. Anulación de las funciones virtuales públicas con funciones privadas en C++
- 28. La devolución de unique_ptr de las funciones
- 29. comentando funciones de devolución de llamada
- 30. Casos de uso de funciones virtuales puras con el cuerpo?
Se espera que el tipo de retorno de la función primordial que se le permitiera ser ...? – curiousguy