我有一个示例,试图从基类“ Animal”创建派生类“ Dog”,但我想创建Animal类的实例并使用其成员(我对C ++中的多态性还很陌生)。
结果产生两行“动物被创造!”。 1行“创建狗!”而我希望每个都可以有1行。

class Animal
{

private:

    int numberOfLegs;
    const char* name;
public:

    int getNumberOfLegs();
    const char* getName();
    virtual void ToString()
    {
        std::cout << "This animal has " << this->getNumberOfLegs();
        std::cout << "leg and its name is " << getName() << std::endl;
    }
    Animal(int, const char*);
    ~Animal();
};

int Animal::getNumberOfLegs()
{

    return this->numberOfLegs;
}

const char* Animal::getName()
{

    return this->name;
}

Animal::Animal(int legs, const char* name)
{

    this->numberOfLegs = legs;
    this->name = name;
    std::cout << "An animal is created!" << std::endl;
}

Animal::~Animal()
{

    std::cout << "An animal is destroyed!" << std::endl;
}

class Dog : public Animal
{
private:

    const char* speech;
public:
    void ToString()
    {

        std::cout << "This dog has " << this->getNumberOfLegs();
        std::cout << " legs and its name is " << this->getName();
        std::cout << " and it says " << this->speech << std::endl;
    }

    Dog(int, const char*, const char*);

    ~Dog();
};

Dog::Dog(int legs, const char* name, const char* speech) : Animal (legs, name)
{

    this->speech = speech;
    std::cout << "A dog is created!" << std::endl;
}

Dog::~Dog()
{

    std::cout << "A dog is destroyed!" << std::endl;
}

int main()
{

        Animal anAnimal(3, "Godzilla");
        Dog myDoge(4, "CuteDoge", "woof");
        char c;
        std::cin.get(c);
    }
}

最佳答案

在您的层次结构中,Dog继承自Animal。这意味着在构造狗时,将首先构造其父项“动物”。这就是为什么在创建狗时会同时获得“动物创建”和“狗创建”的原因。

为避免其他问题,必须遵循3的规则:您具有非平凡的析构函数,因此还应该定义复制构造函数和赋值运算符。否则,您将拥有双重释放和/或使用释放的内存。

另外,由于您可能有不重要的动物子代,因此必须将析构函数虚拟化。除此以外,

std::unique_ptr<Animal> ptr = std::make_unique<Dog>();


在Animal中没有虚拟析构函数的情况下,将永远不会调用Dog析构函数。

07-28 08:25