C 多重继承,虚拟方法覆盖问题和协变量返回类型

C++ Multiple inheritance, virtual method override problems, and covariant return type

本文关键字:变量 返回类型 问题 覆盖 多重继承 虚拟 方法      更新时间:2023-10-16

我正在继承两个类别TfoamIntegrand和ibaseFunctionMultidim,它们都是抽象类。我遇到的问题是,我希望能够使用克隆成员函数,而克隆成员函数对于ibaseFunctionmultidim是一个纯虚拟的,没有参数,而对于tfoamintegrand,它在tfoamintegrand中不是纯虚拟的,而是一个参数(具有默认值)。

class TObject {
   public:
      virtual TObject    *Clone(const char *newname="") const;
   ...
};
class TFoamIntegrand : public TObject  {
public:
   virtual Double_t Density(Int_t ndim, Double_t *) = 0;
   ...
};
class IBaseFunctionMultiDim {
   public:
      /** 
        Clone a function. 
        Each derived class must implement his version of the Clone method
      */
      virtual IBaseFunctionMultiDim * Clone() const = 0;  
    ...
}

我可以编译的唯一方法是做:

class InSANEDiffXSec : public TFoamIntegrand, public ROOT::Math::IBaseFunctionMultiDim {
   public:
      virtual ROOT::Math::IBaseFunctionMultiDim*  Clone() const ;
   ...
}

当然,这会产生有关以争论隐藏克隆的警告。我尝试了以下内容,但我得到了协变量的返回类型错误。

  virtual ROOT::Math::IBaseFunctionMultiDim*  Clone(const char * newname = "") const ;
  virtual InSANEDiffXSec*  Clone(const char * newname = "") const ;

我认为,根据我对协变量返回类型的理解,上面的最后一个版本是正确的。我在这里想念什么?

预先感谢!

编辑:这是一个完整的示例:

class A {
  public:
     virtual A* Clone(const char * name="") { return( new A());}
};
class B {
  public:
     virtual B* Clone() = 0;
};
class C : public A {
  public:
     virtual double Density(int ndim, double *) = 0;
};
class D : public C, public B {
   public:
      virtual double Density(int ndim, double *x) {
         return 0.0;
      }
      //virtual D* Clone(const char * name="") { return( new D());}
      virtual B* Clone() { return( new D());}
};

它编译。更改为注释的行提供:

test.h: In member function ‘virtual D* D::Clone(const char*)’:
test.h:24:62: error: cannot allocate an object of abstract type ‘D’
       virtual D* Clone(const char * name="") { return( new D());}
                                                              ^
test.h:19:7: note:   because the following virtual functions are pure within ‘D’:
 class D : public C, public B {
       ^
test.h:11:17: note:     virtual B* B::Clone()
      virtual B* Clone() = 0;
                 ^
test.cxx: In function ‘int main()’:
test.cxx:7:18: error: cannot allocate an object of abstract type ‘D’
    D * d = new D();
                  ^
In file included from test.cxx:2:0:
test.h:19:7: note:   since type ‘D’ has pure virtual functions
 class D : public C, public B {

此编译:

class TObject {
   public:
      virtual TObject    *Clone(const char *newname="") const = 0;
};
class IBaseFunctionMultiDim {
   public:
      virtual IBaseFunctionMultiDim * Clone() const = 0;  
};
class InSANEDiffXSec :
  public TObject,
  public IBaseFunctionMultiDim
{
   public:
      virtual InSANEDiffXSec*  Clone(const char* newname) const
      {
         return nullptr;
      }
      virtual InSANEDiffXSec*  Clone() const
      {
         return Clone(nullptr);
      }
};

但我确实从您的代码中删除了似乎没有相关的内容。