克++“因为以下虚拟函数是纯的”与抽象基类(g++ “because the following v

2019-08-01 00:13发布

这里是一个产生错误我的例子代码:

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”是好的。

克++抱怨:

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)

我为了重用get_size()和get(INT)inheret SortedContainerImpl从ContainerImpl

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

感谢所有。

Answer 1:

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);}
};


Answer 2:

在C ++一旦你有一个纯虚成员函数的类成为抽象类,你不能创建它的任何物体。
这样的类并不意味着是可实例化由itself.It意指充当接口 。 人会从这样一个抽象类派生和提供的派生类的所有纯虚函数的实现

请注意,您的类SortedContainerImpl从两个类派生SortedContainerContainerImpl
SortedContainer依次从派生Container ,但它永远不会实现了纯虚函数。



文章来源: g++ “because the following virtual functions are pure” with abstract base class