Kann ich eine virtuelle Funktion aufrufen, um ein Basisklassen-Unterobjekt zu initialisieren?

ch weiß, dass virtuelle Funktionen in einem Konstruktor weder direkt noch indirekt aufgerufen werden sollten, aber dieser Code funktioniert einwandfre
Ist das, was ich hier habe, sicher?

#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"
}

Wenn nicht, wäre das Folgende (basierend auf einem Kommentar) eine korrekte Problemumgehung?

// 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
};

Antworten auf die Frage(1)

Ihre Antwort auf die Frage