0

私は次のクラス構造を持っています:

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

間違ったことはわかりませんが、なぜこれが起こっているのですか?

4

2 に答える 2

3

I suspect that your first virtual function hides your second function, you should do this in your subclass:

using MyBase::exportData;

Making this function explicitly visible to your subclass.

Live Example

于 2013-03-11T09:27:58.650 に答える
1

で宣言virtual ExportData exportData()することでMySubClass、 を隠していvirtual bool exportData(QString filepath)ます。using宣言を使用してスコープに入れる必要があります。

class MySubClass : public MyClass
{
   public:
      using MyBase::exportData;
      virtual ExportData exportData(){//some implementation}
};
于 2013-03-11T09:28:27.243 に答える