11

这是我产生错误的示例代码:

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)

我从 ContainerImpl 继承 SortedContainerImpl 以便重用 get_size() 和 get(int)

我不熟悉 c++,这个问题的本质是什么,我该如何解决?

谢谢大家。

4

2 回答 2

21

在 C++ 中,一旦你有了一个纯虚成员函数,你的类就变成了抽象类,你不能创建它的任何对象。
这样的类本身并不意味着可以实例化。它意味着充当接口。可以从这样一个抽象类派生,并在派生类中提供所有纯虚函数的实现

请注意,您的类SortedContainerImpl派生自两个类SortedContainerContainerImpl.
SortedContainer反过来派生自Container但它从未实现纯虚函数。

于 2012-09-27T07:08:01.563 回答
7

你的SortedContainerImpl类有两个独立的Container基类。一个是虚拟的(通过SortedContainer类),另一个是非虚​​拟的(通过ContainerImpl类)。

SortedContainerImpl有来自 的基础的Container::get_size()和的具体实现,但没有来自 via 的虚拟基础的具体实现。Container::get(int)ContainerImplSortedContainer

解决该问题的一种方法是在以下位置给出具体实现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);}
};
于 2012-09-27T07:21:20.277 回答