Не могу проинициализировать родительские классы (проблема ромба)

Я изучаю так называемую "проблему ромба, алмаза смерти". При попытке проинициализировать родительские классы через дочерний, получаю ошибки:

error C2594: инициализация: неоднозначные преобразования "Frankenstein *" в "Animal *"

error C2243: приведение типов: преобразование "Frankenstein *" в "Animal *" существует, но недоступно

Код:

class Animal
{
public:
    std::string name;
    Animal(std::string n):name(n) {}
    ~Animal() {}
    virtual void sayName() { std::cout << "It's a basic function"; }
};

class Bird :public Animal
{
public:
    Bird(std::string n) :Animal(n) {}
    virtual void sayName() { std::cout << "Hello! I'm Bird. Ny name is: " << name; }
};

class Dog :public Animal
{
public:
    Dog(std::string n) :Animal(n) {}
    virtual void sayName() { std::cout << "Hello! I'm Dog. Ny name is: " << name; }
};

//создаю дочерний класс от дочерних классов, где родитель Animal
class Frankenstein :public Bird, Dog
{
public:
//уверен, что ошибка в инициализации родительский классов, но в чем именно?
    Frankenstein(std::string a, std::string b):Bird(a),Dog(b) {}
    virtual void sayName() { std::cout << "Hello! I'm frankenstein. Ny name is: " << Bird::name << " or " << Dog::name; }
};

int main() {
    Animal* ptr = new Frankenstein{ "Pirat", "Puffy" };
    ptr->sayName();
}

Ответы (1 шт):

Автор решения: afjord

Слегка подправил класс, чтобы увидеть вызов деструкторов, плюс main изменил Animal на Frankenstein. Чтобы не приводить типы, т.к. это в данном случае не критично.

class Animal
{
public:
    std::string name;

    Animal(const std::string &name) : name(name) {}

    virtual ~Animal() {
        std::cout << "Animal destructor\n";
    }
    virtual void sayName() { std::cout << "It's a basic function"; }
};

class Bird :public Animal
{
public:
    Bird(std::string n) :Animal(n) {}
    virtual void sayName() { std::cout << "Hello! I'm Bird. Ny name is: " << name; }
};

class Dog :public Animal
{
public:
    Dog(std::string n) :Animal(n) {}
    virtual void sayName() { std::cout << "Hello! I'm Dog. Ny name is: " << name; }
};

//создаю дочерний класс от дочерних классов, где родитель Animal
class Frankenstein :public Bird, Dog
{
public:
//уверен, что ошибка в инициализации родительский классов, но в чем именно?
    explicit Frankenstein(const std::string& a, const std::string& b) : Bird(b), Dog(a) {
}
    virtual void sayName() { std::cout << "Hello! I'm frankenstein. Ny name is: " << Bird::name << " or " << Dog::name << std::endl; }
};

int main() {
    Frankenstein* ptr = new Frankenstein("Pirat", "Puffy");
    ptr->sayName();
    delete ptr;
}
→ Ссылка