¿Puedo llamar a una función virtual para inicializar un subobjeto de clase base?
Sé que las funciones virtuales no deberían llamarse directa o indirectamente en un constructor, pero este código funciona bien.
¿Es seguro lo que tengo aquí?
#include <iostream>
#include <string>
struct A {
A (const std::string& name) {std::cout << name << std::endl;}
virtual std::string tag() const = 0;
};
struct B: A {
B() : A (tag()) {}
virtual std::string tag() const override {return "B";}
};
int main() {
B b; // Output gives "B\n"
}
Si no, ¿sería lo siguiente (basado en un comentario) una solución alternativa correcta?
// Replacement for class B:
struct B: A {
B() : A (name()) {}
virtual std::string tag() const override {return name();}
private:
static std::string name() {return "B";} // use static function
};