Вот мой пример кода, который выдает ошибку:
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 ++, какова природа этой проблемы и как я могу это исправить?
Спасибо всем.
Ваш 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);}
};
В C ++ Когда у вас есть чисто виртуальная функция-член, ваш класс становится абстрактным классом, и вы не можете создавать его объекты.
Такой класс не предназначен для того, чтобы быть экземпляром сам по себе. Он должен действовать как Интерфейс. Можно было бы извлечь из такого абстрактного класса и обеспечить реализации всех чисто виртуальных функций в производном классе.
Обратите внимание, что ваш класс SortedContainerImpl
происходит от двух классов SortedContainer
а также ContainerImpl
,
SortedContainer
в свою очередь происходит от Container
но он никогда не реализует чисто виртуальные функции.