gpt4 book ai didi

C++ 使用纯虚函数实例化抽象类的子类

转载 作者:行者123 更新时间:2023-11-30 01:41:55 25 4
gpt4 key购买 nike

我有一个抽象类,例如Animal。 Animal 有一个纯虚函数eat,每个动物如果不想饿死就必须执行这个函数。我确保只有 Animal 的 child 可以通过这种方式实例化:

动物.hpp

class Animal
{

public:

enum eAnimal{
CAT=0,
DOG=1,
BIRD=2
};

// Instantiates the desired animal.
static Animal GetAnimal(const int animal);

virtual void Eat() const = 0;

protected:

Animal();
};

动物.cpp

Animal Animal::GetAnimal(const int animal)
{
switch(animal)
{
case CAT:
return Cat();
case DOG:
return Dog();
case BIRD:
return Bird();
default:
cerr << "Animal not recognized." << endl;
exit(-1);
}
}

Animal::Animal()
{}

有了这个,将是:

猫.hpp

class Cat : public Animal
{

public:

Cat();

void Eat() const;
};

猫.cpp

Cat::Cat() : Animal()
{}

void Cat::Eat() const
{
// The cat eats.
}

但是这段代码不起作用,它在 GetAnimal 中得到一个错误invalid abstract return type 'Animal',因为 Animal 是抽象的并且不能被实例化,尽管我的 API 确保它不会。

这个问题可能有哪些聪明的解决方案?我可以做函数 Eat not pure 并给它一个默认实现,但我不想这样做。

最佳答案

Animal Animal::GetAnimal(const int animal)
{
switch(animal)
{
case CAT:
return Cat();
case DOG:
return Dog();
case BIRD:
return Bird();
default:
cerr << "Animal not recognized." << endl;
exit(-1);
}
}

你说 GetAnimal 应该返回一个 Animal 对象,这不是继承的工作方式,继承主要通过指针工作。当您尝试返回某个类型的对象时,编译器必须隐式地创建一个 Animal 对象,但这是不允许的,因为 Animal 是一个抽象类。即使您将eat() 设为仅虚拟,您仍然会得到object slicing。问题。

您可以让它返回一个Animal* 并在您使用它之后释放结果:

Animal* Animal::GetAnimal(const int animal)
{
switch(animal)
{
case CAT:
return new Cat();
case DOG:
return new Dog();
case BIRD:
return new Bird();
default:
cerr << "Animal not recognized." << endl;
exit(-1);
}
}

来电者:

Dog* myDog = GetAnimal(DOG);

//somewhere later when you dont need myDog anymore..(don't forget this!)
delete myDog;

但是如果你可以访问 C++11 或更高版本,我建议使用智能指针而不是原始指针来让指针自行释放:

#include <memory>
std::unique_ptr<Animal> Animal::GetAnimal(const int animal)
{
switch(animal)
{
case CAT:
return std::make_unique<Cat>();
case DOG:
return std::make_unique<Dog>();
case BIRD:
return std::make_unique<Bird>();
default:
cerr << "Animal not recognized." << endl;
exit(-1);
}
}

来电者:

auto dog = GetAnimal(DOG);
//no explicit delete required.

关于C++ 使用纯虚函数实例化抽象类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40513958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com