Не могу проинициализировать родительские классы (проблема ромба)
Я изучаю так называемую "проблему ромба, алмаза смерти". При попытке проинициализировать родительские классы через дочерний, получаю ошибки:
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;
}