#include
using namespace std;
class Mammal {
public:
virtual bool lays_eggs() {return false;}
};
class Cat: public Mammal
{
public:
};
class Platypus: public Mammal
{
public:
bool lays_eggs() {return true;}
};
class Dog: public Mammal
{
public:
};
Mammal *factory()
{
switch( rand() % 3 )
{
case 0: return new Dog;
case 1: return new Cat;
case 2: return new Platypus;
}
return 0;
}
int main()
{
Mammal *ptr;
int i;
int c=0, d=0, p=0;
for(i = 0; i
C/C++
Если указатель работает с указателем повторное объявление указателя не является не обходимым?
Здесь вы возвращаете из метода factory() указатель на производный класс и присваиваете его указателю на базовый класс.
Если в базовом классе объявлен виртуальный метод, наследование также должно быть виртуальным.
В общем, изучайте...
Если в базовом классе объявлен виртуальный метод, наследование также должно быть виртуальным.
В общем, изучайте...
#include
#include
#include
#include
#include
#include
#define RAND(min, max) (rand() % ((max) - (min)) + (min))
using namespace std;
struct Animal {
virtual ~Animal() {}
virtual string voice()const = 0;
};
struct Cat : virtual public Animal {
string voice()const override {
return "мяу";
}
};
struct Dog : virtual public Animal {
string voice()const override {
return "гав";
}
};
struct Cow : virtual public Animal {
string voice()const override {
return "му";
}
};
// Фабрика это тоже класс
// «Умный» указатель сам освобождает занятую память
struct FactoryAnimal {
FactoryAnimal() {
srand(unsigned(time(nullptr)));
}
unique_ptr create() {
switch (RAND(0, 3)) {
case 0: return make_unique();
case 1: return make_unique();
case 2: return make_unique();
}
}
};
int main() {
system("chcp 1251 > nul");
array animals{};
FactoryAnimal fa;
for (auto& animal : animals) animal = fa.create();
size_t dog = 0;
size_t cat = 0;
size_t cow = 0;
for (auto& animal : animals) {
if (typeid(*animal) == typeid(Cat)) ++cat;
if (typeid(*animal) == typeid(Dog)) ++dog;
if (typeid(*animal) == typeid(Cow)) ++cow;
cout voice()
Утечка памяти. При каждом новом ptr = factory() у тебя создается в памяти новый объект, но старый не удаляется. Не забывай чистить память.
Похожие вопросы
- Если указатель уже объявлен как указатель то при повторном объявлении мы обращаемся не к указателю а к адресу ссылки?
- Не совсем понял как работает C++ код с указателями
- Различие указателей int *; и char *;
- Передача в метод класса указателя на функцию C++
- C/C++ Как устроена память, выделенная для структуры с указателем *next?
- В чём причина? Понторезов с очень высшим образованием слушать не буду. Только тех, кто практикует работу с указателями вС++
- Указатели. Типизированные указатели. Указатели та массивы. Функции пользователя
- Ссылки и указатели
- Указатели. Программирование с использованием динамических двухмерным масивов.
- Как в с++ можно ввести строку заданную через указатель