在子类中未检测到 C++ 纯虚函数

Posted

技术标签:

【中文标题】在子类中未检测到 C++ 纯虚函数【英文标题】:C++ Pure virtual function not detected in subclass 【发布时间】:2013-03-11 09:22:56 【问题描述】:

我有以下类结构:

class MyBase

   public:
      virtual ExportData exportData() = 0;
      virtual bool exportData(QString filepath)
      
         ExportData data = exportData();
         data.save(filepath);
      
;

class MyClass : public MyBase

   public:
      virtual ExportData exportData()//some implementation
;

class MySubClass : public MyClass

   public:
      virtual ExportData exportData()//some implementation
;

然后我将数据导出如下:

MySubClass *sub = new MySubClass();
sub->exportData("/home/me/export.xml");

尝试使用 g++ 编译时,出现以下错误:

error: no matching function for call to ‘MySubClass::exportData(QString)’
note: candidate is: virtual ExportData MySubClass::exportData()
note:   candidate expects 0 arguments, 1 provided

我没有发现我做错了什么,为什么会这样?

【问题讨论】:

这两个函数做的事情完全不同。一个将数据导出到文件,另一个生成要导出的数据。给他们不同的、更具描述性的名字? (而且,如果性能和响应性意味着什么,文件 io 应该是异步的——这意味着 io 函数应该至少是名称类型的,甚至可能公开异步原语:这些函数不会相互覆盖的非常关键的方式) 【参考方案1】:

我怀疑你的第一个虚函数隐藏了你的第二个函数,你应该在你的子类中这样做:

using MyBase::exportData;

让这个函数对你的子类显式可见。

Live Example

【讨论】:

但这两个函数有不同的参数,所以据我记忆,编译器会将它们视为两个不同的函数。还是我错了? @goocreations 是的,它会看到它们,但是看到你从你的 Base 派生两次,然后你才实现你的一个重载,你 隐藏另一个,你需要用using 语句把它带入作用域,让编译器知道另一个函数也存在。 所以我这样做并得到以下错误:错误:'virtual bool MyBase::exportData(QString)' is inaccessible @goocreations 看看我发布的例子。 没有更好的办法吗?目前有 8 个子类,我必须将它添加到每个类中。【参考方案2】:

通过在MySubClass 中声明virtual ExportData exportData(),您隐藏了virtual bool exportData(QString filepath)。您需要使用 using 声明将其引入范围:

class MySubClass : public MyClass

   public:
      using MyBase::exportData;
      virtual ExportData exportData()//some implementation
;

【讨论】:

以上是关于在子类中未检测到 C++ 纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章

C++学习笔记11--纯虚函数和抽象类

C++纯虚函数和抽象类

纯虚函数的 C++ 继承

虚函数与纯虚函数

C++ 纯虚函数和抽象类

C++ 纯虚函数和抽象类