Ich habe eine abstrakte Klasse, lassen Sie es zum Beispiel Animal. Ein Tier hat eine rein virtuelle Funktion essen, die jedes Tier implementieren muss, wenn sie nicht verhungern wollen. Ich stelle sicher, dass nur ein Kind eines Tieres kann durch diese Art und Weise instanziert werden:C++ Instantiierung von Childs einer abstrakten Klasse mit rein virtuellen Funktionen
ANIMAL.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();
};
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()
{}
Damit ein Cat wäre:
CAT.HPP
class Cat : public Animal
{
public:
Cat();
void Eat() const;
};
Cat.cpp
Cat::Cat() : Animal()
{}
void Cat::Eat() const
{
// The cat eats.
}
jedoch nicht dieser Code nicht funktioniert, wird es einen Fehler ungültig abstrakten Rückgabetyp 'Animal' in GetAnimal, weil Tiere abstrakt und nicht instanziiert werden kann, obwohl meine API sicherstellt, dass es nicht geht.
Welche intelligenten Lösungen könnte dieses Problem haben? Ich kann die Funktion essen nicht rein und geben Sie eine Standardimplementierung, aber ich möchte es nicht tun.
@Galik Einige Kameras sind Tiere. –
Virtuelle Member-Funktionen arbeiten mit Zeigern – Amadeus
Sind Sie sicher, dass Sie hier Laufzeit-Polymorphismus benötigen? – SergeyA