C 多重继承,虚拟方法覆盖问题和协变量返回类型
C++ Multiple inheritance, virtual method override problems, and covariant return type
我正在继承两个类别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);
}
};
但我确实从您的代码中删除了似乎没有相关的内容。
相关文章:
- 如何获取std::result_of函数的返回类型
- C++ 根据给定的类型名从变量返回数据
- 使用函数模板返回类型 X 的变量的值
- 具有变量返回类型的函数
- 从保存变量数据类型的数据结构中检索值,而不指定返回类型
- 带有 QVariant 和模板的变量返回类型
- 使用C 模板作为返回类型/变量名称
- C++-17变量模板:捕获回调参数的返回类型和参数类型
- C 多重继承,虚拟方法覆盖问题和协变量返回类型
- 变量返回类型
- 变量模板函数,其中返回类型取决于模板参数列表
- 有没有一种方法可以将C++数据类型作为变量返回
- 类函数的模板变量返回类型
- C++函数,使用'auto'变量返回类型
- 返回类型是类中的一个变量
- 在c++中,是否有可能获取函数的返回类型,以便在不调用该函数的情况下声明该变量?
- 从返回类型的函数中获取结果'void'而结果变量是输入参数之一 - C++
- 变量返回类型上转换覆盖c++
- 隐式返回返回类型变量
- C ++中新运算符的返回类型是什么?为什么我们可以将返回值分配给变量(非指针)?