g ++ & quot; потому что следующие виртуальные функции являются чистыми & quot; с абстрактным базовым классом

Вот мой пример кода, который выдает ошибку:

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;

кажется, что «SortedContainerImpl» не работает, в то время как «ContainerImpl» в порядке.

G ++ жалуется:

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)

Я наследовал SortedContainerImpl из ContainerImpl, чтобы повторно использовать get_size () и get (int)

Я не знаком с c ++, какова природа этой проблемы и как я могу это исправить?

Спасибо всем.

6

Решение

Ваш SortedContainerImpl класс имеет два отдельных Container базовые классы. Один виртуальный (через SortedContainer класс), а другой не является виртуальным (через ContainerImpl учебный класс).

SortedContainerImpl имеет конкретные реализации Container::get_size() а также Container::get(int) для базы, которая поступает из ContainerImpl, но не для виртуальной базы, которая приходит через SortedContainer,

Один из способов решения этой проблемы — дать конкретные реализации в SortedContainerImpl:

class SortedContainerImpl
: public SortedContainer, public ContainerImpl
{
private:
typedef ContainerImpl Base;
public:
int find(int var){return Base::impl_.find(var);}

int get_size() {return ContainerImpl::get_size();}
int get(int rowid) {return ContainerImpl::get(rowid);}
};

Другим способом было бы сделать Container виртуальный базовый класс ContainerImpl, так SortedContainerImpl только один, виртуальный, базовый Container:

class ContainerImpl : virtual public Container
{
protected:
Impl impl_;
public:
int get_size() {return impl_.data_size_;}
int get(int rowid) {return impl_.get(rowid);}
};
6

Другие решения

В C ++ Когда у вас есть чисто виртуальная функция-член, ваш класс становится абстрактным классом, и вы не можете создавать его объекты.
Такой класс не предназначен для того, чтобы быть экземпляром сам по себе. Он должен действовать как Интерфейс. Можно было бы извлечь из такого абстрактного класса и обеспечить реализации всех чисто виртуальных функций в производном классе.

Обратите внимание, что ваш класс SortedContainerImpl происходит от двух классов SortedContainer а также ContainerImpl,
SortedContainer в свою очередь происходит от Container но он никогда не реализует чисто виртуальные функции.

13

По вопросам рекламы [email protected]