g++ “parce que la suite de fonctions virtuelles sont de la pure” avec la classe de base abstraite
Voici mon exemple de code qui génère l'erreur:
struct Impl
{
int data_size_;
int find(int var){return 0;}
int get(int rowid){return 0;}
};
class Container
{
public:
Container() {}
virtual ~Container() {}
virtual int get_size() = 0;
virtual int get(int rowid) = 0;
};
class SortedContainer : virtual public Container {
public:
virtual int find(int var) = 0;
};
class ContainerImpl : public Container
{
protected:
Impl impl_;
public:
int get_size() {return impl_.data_size_;}
int get(int rowid) {return impl_.get(rowid);}
};
class SortedContainerImpl
: public SortedContainer, public ContainerImpl
{
private:
typedef ContainerImpl Base;
public:
int find(int var){return Base::impl_.find(var);}
};
ContainerImpl ci;
SortedContainerImpl sci;
il semble "SortedContainerImpl" n'a pas fonctionné alors que "ContainerImpl" est très bien.
g++ se plaint:
example_b.cpp:42:21: error: cannot declare variable ‘sci’ to be of abstract type ‘SortedContainerImpl’
example_b.cpp:32:7: note: because the following virtual functions are pure within ‘SortedContainerImpl’:
example_b.cpp:13:15: note: virtual int Container::get_size()
example_b.cpp:14:15: note: virtual int Container::get(int)
Je inheret SortedContainerImpl de ContainerImpl afin de pouvoir les réutiliser get_size() et get(int)
Je ne suis pas familier avec le c++, Quelle est la nature de ce problème et Comment puis-je résoudre ce problème?
Merci à tous.
OriginalL'auteur tdihp | 2012-09-27
Vous devez vous connecter pour publier un commentaire.
Votre
SortedContainerImpl
classe a deux distinctsContainer
classes de base. L'un est virtuel (via leSortedContainer
classe) et l'autre est non-virtuel (via leContainerImpl
classe).SortedContainerImpl
a des implémentations concrètes deContainer::get_size()
etContainer::get(int)
pour la base qui vient deContainerImpl
, mais pas pour la base virtuelle qui vient viaSortedContainer
.Une façon de résoudre le problème est de donner des implémentations concrètes dans
SortedContainerImpl
:Une autre solution serait de faire
Container
une classe de base virtuelle deContainerImpl
, doncSortedContainerImpl
obtenez seulement l'une, virtuel, de la base deContainer
:OriginalL'auteur Michael Burr
En C++ une Fois que vous avez une fonction membre virtuelle pure votre classe devient classe abstraite et vous ne pouvez pas créer des objets.
Une telle classe n'est pas destiné à être instanciable par lui-même.Il est conçu pour agir comme une Interface. On pourrait tirer d'une telle classe abstraite et fournir des implémentations de toutes les fonctions virtuelles pures dans la classe dérivée.
Noter que votre classe
SortedContainerImpl
de la fusion de deux classesSortedContainer
etContainerImpl
.SortedContainer
à son tour, dérive deContainer
mais il n'a jamais implémente les fonctions virtuelles pures.OriginalL'auteur Alok Save