C++ g++&引用;因为以下虚拟函数是纯的;具有抽象基类

C++ g++&引用;因为以下虚拟函数是纯的;具有抽象基类,c++,polymorphism,virtual-functions,diamond-problem,C++,Polymorphism,Virtual Functions,Diamond Problem,下面是产生错误的示例代码: 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; };

下面是产生错误的示例代码:

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;
“分拣集装箱”似乎出了问题,而“集装箱”则没问题

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)
我从ContainerMPL中输入SortedContaineImpl,以便重用get_size()和get(int)

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


<>谢谢。

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

请注意,您的类
SortedContainerImpl
派生自两个类
SortedContainer
ContainerImpl


SortedContainer
又派生自
Container
,但它从未实现纯虚拟功能

您的
SortedContainerImpl
类有两个独立的
容器
基类。一个是虚拟的(通过
SortedContainer
类),另一个是非虚拟的(通过
containermpl
类)

SortedContainerImpl
为从
ContainerImpl
进入的基提供了容器::get_size()和容器::get(int)的具体实现,但不适用于通过
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);}
};

谢谢,看来你的答案是对的。我真的应该让所有的接口类实际上到处都继承吗?