W jaki sposób można wydrukować pochodną nazwę klasy z klasy bazowej bez łączenia konstruktorów do końca. Innymi słowy, czy można to zrobić ściśle z klasy bazowej bez dodawania kodu w każdej klasie pochodnej?Drukowanie nazwy klasy pochodnej w klasie bazowej
To jest przykład tego, co mam, a jeśli istnieje sposób, chciałbym pozbyć się łańcucha konstruktora.
EDYCJA: Idealnie szukam czegoś do dodania do klasy bazowej bez konieczności edycji wszystkich klas pochodnych. W tym momencie mój prawdziwy kod ma ~ 17 klas (z potrzebą więcej), więc coś, co mogłoby wykonać pracę prosto z klasy bazowej byłoby idealne. Nawet jeśli jest to specyficzne dla kompilatora (g ++ lub 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;
}
która drukuje:
Creating GrandGrandChild
Creating GrandChild
Creating Child
Ale z skompilowany dodanego prefiksu.
Użyj polimorfizmu, a nie RTTI, do czego służy polimorfizm. – Griwes
Zamierzam używać go wyłącznie do celów debugowania, dlatego warto rzucić coś na podstawową klasę. – NFA
nie dynamicznie tworzy instancji obiektów, np. "GrandGrandChild A;" byłoby całkowicie wystarczające do oceny domyślnego konstruktora. – moooeeeep