是否可以从两个不同的抽象类继承只有返回类型不同的同名运算符。 如果是这样,他们:
实现运算符的语法是什么
使用/解析运算符的语法是什么
一般情况下的开销是多少,与其他虚拟函数相同?
如果您能为我提供有用的参考或示例代码
感谢
12struct abstract_matrix { 13 virtual double& operator()(int i, int j); 14}; 15 16 struct abstract_block_matrix { 17 virtual double* operator()(int i, int j); 18 }; 19 20struct block_matrix : abstract_matrix, abstract_block_matrix { 21 22};
块矩阵需要为两个运算符提供实现,因此它可以是矩阵或块矩阵,具体取决于上下文。我不知道如何提供特定于block_matrix类的实现。 现在,它通过传递对象包装类型作为最后一个参数来完成,但这似乎不是很干净。我想保留纯矩阵表示法。
答案 0 :(得分:1)
您不能在返回类型上重载。当调用函数或运算符时,编译器必须知道要调用哪一个。它不会根据分配给函数(运算符)的函数来推断它。
看起来你正在寻求实现一些矩阵数学。也许如果您下载DirectX SDK或OpenGL并看看他们是如何做到的,您可能会对如何正确地做到这一点有所了解。
答案 1 :(得分:1)
函数的返回类型不是它的签名的一部分,因此你不能在block_matrix中有两个operator +(i,j) - 这将是一个模糊的调用。因此,在这一点上,多重继承有点像红鲱鱼。你不能这样做。
你真正想做什么,为什么?
无论如何,对于您的另一个问题:虚拟运营商在性能和运营方式方面与虚拟功能完全相同。你如何使用它们只有轻微的语义差异 - 但在引擎盖下它们就像其他任何一样。
答案 2 :(得分:0)
我得到了它的工作,但它很不稳定。我喜欢模板。
template<class T>
class Base1
{
};
template<class T>
class Base2
{
};
class Derived;
template<>
class Base1<Derived>
{
public:
double foo(){return 0.1;}
};
template<>
class Base2<Derived>
{
public:
int foo(){return 1;}
};
class Derived
: public Base1<Derived>
, public Base2<Derived>
{
public:
using Base1<Derived>::foo;
};
int main()
{
double sum = 0;
Derived d;
sum += d.foo(); //+ .1
Base1<Derived> * pI = &d;
sum += pI->foo(); //+ .1
Base2<Derived> * pF = &d;
sum += pF->foo(); //+ 1
return (sum*10);
}
如果没有模板,我无法让它工作,虽然它似乎应该能够。我不确定你是否能以同样的方式完成模板化的成员函数,但我的直觉说“不”。
在代码组织方面,我会在Derived的定义或声明之后定义Base#stuff,因为它确实是它的用途。请注意,您可以使用typename Base1<Derived> something
使事情变得更漂亮。
编辑: 啊对!它不允许你做“使用”技巧或具有不同的返回类型,但它更简单:
class Derived
: public Base1
, public Base2
{
double Base1::foo(){...}
double Base2::foo(){...}
}
结合这两种方法可能有一种可怕的,可怕的,令人敬畏的方式,但我认为在使用代码时它实际上并没有帮助。我可以回复你。