c++ - g++ "because the following virtual functions are pure"带抽象基类

标签 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;
};


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++,这个问题的本质是什么,我该如何解决?

谢谢大家。

最佳答案

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

请注意,您的类 SortedContainerImpl 派生自两个类 SortedContainerContainerImplSortedContainer 又派生自 Container 但它从未实现纯虚函数。

关于c++ - g++ "because the following virtual functions are pure"带抽象基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12615904/

相关文章:

c++ - Java 字节码的即时编译

c# - 重载方法——引用和实例化对象的区别

c++ - 是否定义了静态初始化实现的顺序?

c++ - 未定义的引用类?

c++ - 来自 vector C++ 中字节表示的 Int

haskell - 类型家族多态性

C++ 从具有已知基类的未知中间类继承

函数生成多态对象的 C++ 返回类型?

c++ - 将虚拟方法放在可复制类型上是否是个好主意?

javascript - JavaScript 中的虚函数是什么?