我有一个示例,试图从基类“ 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析构函数。