¿Cómo puedo imprimir el nombre de clase derivado de la clase base sin tener que encadenar a los constructores hasta el final? En otras palabras, ¿es posible hacer esto estrictamente desde la clase base sin agregar código en cada clase derivada?Impresión del nombre de clase derivada en la clase base
Este es un ejemplo de lo que obtuve, y si hay una manera en la que me gustaría deshacerme del encadenamiento de constructores.
EDIT: Idealmente, estoy buscando algo para agregar a la clase base sin tener que editar todas las clases derivadas. Por el momento, mi código real tiene ~ 17 clases (con la necesidad de más), por lo que algo que podría hacer el trabajo directamente desde la clase base sería ideal. Incluso si es específico del compilador (g ++ o clang).
#include <iostream>
class Base {
public:
Base(std::string id) {
std::cout<<"Creating "<<id<<std::endl;
}
};
class Child : Base {
public:
Child(std::string id) : Base(id) {}
Child() : Base(typeid(this).name()) {}
};
class GrandChild : Child {
public:
GrandChild(std::string id) : Child(id) {}
GrandChild() : Child(typeid(this).name()) {}
};
class GrandGrandChild : GrandChild {
public:
GrandGrandChild(std::string id) : GrandChild(id) {}
GrandGrandChild() : GrandChild(typeid(this).name()) {}
};
int main() {
GrandGrandChild *A = new GrandGrandChild();
GrandChild *B = new GrandChild();
Child *C = new Child();
return 0;
}
que imprime:
Creating GrandGrandChild
Creating GrandChild
Creating Child
Pero con el prefijo añadido compilado.
Usa polimorfismo, no RTTI, para eso sirve el polimorfismo. – Griwes
Tengo la intención de usarlo solo para depuración, que es la razón por la cual algo conveniente incluir en la clase base sería conveniente. – NFA
no crea una instancia de los objetos dinámicamente, p. 'GrandGrandChild A;' sería perfectamente suficiente para evaluar el constructor predeterminado. – moooeeeep