C/C++

Если указатель работает с указателем повторное объявление указателя не является не обходимым?

 #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
Олег Бердников
Олег Бердников
67 250
Здесь вы возвращаете из метода 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()
Бактур Байжанулы
Бактур Байжанулы
64 567
Лучший ответ
Утечка памяти. При каждом новом ptr = factory() у тебя создается в памяти новый объект, но старый не удаляется. Не забывай чистить память.
Николай Литвяк
Николай Литвяк
46 835