父类转为子类指针C ++

时间:2017-10-17 20:27:27

标签: c++

我有一个指针设置为一个新的对象数组:

Animal* pAnimals = new Animal[10];

Animal类有一个名为Dog的子类,具有一些更具体的功能。

我需要让pAnimals指针数组中的一些对象成为狗,但不是全部。这是我到目前为止所尝试的,但内存泄漏:

Animal* pAnimals = new Animal[10];

Animal ** pCurrent = &pAnimals;

for (size_t i = 0; i < 8; i++)
{
    *(pCurrent + i) = new Dog();
} 

我知道Animal* pAnimals = new Animal[10];正在堆上创建10个Animal个对象,所以我需要稍后删除它们。

3 个答案:

答案 0 :(得分:1)

您必须先创建一个Animal - 指针的数组。

Dog

然后,您可以创建std::vector的子类实例,如std:array。正如其他人所建议的那样,你应该考虑使用#include <iostream> using namespace std; class Animal {}; class Dog : public Animal {}; int main() { Animal **pAnimaly = new Animal*[10]; for (size_t i = 0; i < 10; i++) { cout << pAnimaly[i] << endl; } cout << "---" << endl; for (size_t i = 0; i < 8; i++) { pAnimaly[i] = new Dog(); } for (size_t i = 0; i < 10; i++) { cout << pAnimaly[i] << endl; if (pAnimaly[i] != nullptr) { cout << "Freeing memory.." << endl; delete pAnimaly[i]; } } return 0; } $('.box').not('.' + optionValue)而不是普通的数组,但我认为它只是一个讲座,所以做一些低水平的学习可能很好。

optionValue

答案 1 :(得分:0)

看看这个。也许它会帮助你。
有一个Animal类(非常简单,但这只是一个例子)并且有两个派生类。然后在main函数中,有vector shared_ptrAnimal s。其中一些指针指向Animal个对象,其他指针指向DogCat s。

#include <random>
#include <vector>
#include <memory>

class Animal {
public:
    virtual ~Animal() = default;
};

class Dog : public Animal {
};

class Cat : public Animal {
};

int main() {
    std::random_device gen;
    std::uniform_int_distribution<unsigned int> dist(0, 2);
    std::vector<std::shared_ptr<Animal>> animals;
    for(unsigned int i = 0; i < 10; ++i) {
        animals.push_back([&] () -> std::shared_ptr<Animal> {
            switch(dist(gen)) {
                case 0:
                    return std::make_shared<Animal>();

                case 1:
                    return std::make_shared<Dog>();

                case 2:
                    return std::make_shared<Cat>();
            }
        }());
    }
}

答案 2 :(得分:-1)

Animal* animals[10];
for(int i = 0; i < 8; i++)
{
    animals[i] = new Dog();
}
animals[8] = new Animal();
animals[9] = new Animal();