Попробовал, перепеписать код из книжки Head First про паттерны, на C++, но появляется ошибка E0322 object of abstract class type "MallardDuck" is not allowed: Duck d:\Code\CODE\C++\Duck\Duck\Source.cpp 119 т.е. компилятор не видит реализованный класс. #include "iostream" using namespace std;
class IFlyBehavior
{
public:
virtual void fly() = 0;
};
class FlyWithWings : public IFlyBehavior
{
public:
void fly() override
{
cout << "fly!";
}
};
class FlyNoWay : public IFlyBehavior
{
public:
void fly() override
{
cout << "no fly!";
}
};
class IQuackBehavior
{
public:
virtual void quack() = 0;
};
class Quack : public IQuackBehavior
{
public:
void quack() override
{
cout << "Quack!";
}
};
class Squeak : public IQuackBehavior
{
public:
void quack() override
{
cout << "Squeak!";
}
};
class MuteQuack : public IQuackBehavior
{
public:
void quack() override
{
cout << "Can't quack";
}
};
class Duck : public IFlyBehavior, IQuackBehavior
{
public:
FlyWithWings* fly_behavior;
Quack* quack_behavior;
void swim()
{
cout << "Swim!";
}
virtual void display() = 0;
void performQuack()
{
quack_behavior->quack();
}
void performFly()
{
fly_behavior->fly();
}
};
class MallardDuck : public Duck
{
public:
MallardDuck()
{
quack_behavior = new Quack();
fly_behavior = new FlyWithWings();
}
void display() override
{
cout << "Mallard!";
}
};
class RedheadDuck : public Duck
{
public:
void display() override
{
cout << "RedHead!";
}
};
class DecoyDuck : public Duck
{
public:
void display() override
{
cout << "DecoyDuck!";
}
};
class RubberDuck : Duck
{
public:
void display() override
{
cout << "RubberDuck!";
}
};
int main(int argc, char* argv[])
{
Duck* md = new MallardDuck;
md->performFly();
md->performFly();
return 0;
}
В MallardDuck
не реализованы функции fly
и quack
. Они остались чисто виртуальными от базовых классов. Нужно эти реализации обеспечить.
На самом деле, просто вместо perform-
функций надо использовать имена из интерфейсных классов и тогда всё будет ок:
void quack() override
{
quack_behavior->quack();
}
void fly() override
{
fly_behavior->fly();
}
Ну и в main
поправить само собой. Тест
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В чем разница char arr[100] и char *arr1 = new char[100] и почему функция gets_s(char*) работает при gets_s(arr), но не работает gets_s(arr1)?
Найдите такое число x, что x^2+sqrt(x)=C , с точностью не менее 6 знаков после точки