在子类中未检测到 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++ 纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章