C ++多重继承关闭同名的运算符

时间:2010-01-01 23:02:26

标签: c++ inheritance virtual multiple-inheritance

是否可以从两个不同的抽象类继承只有返回类型不同的同名运算符。 如果是这样,他们:

  • 实现运算符的语法是什么

  • 使用/解析运算符的语法是什么

  • 一般情况下的开销是多少,与其他虚拟函数相同?

如果您能为我提供有用的参考或示例代码

感谢

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类的实现。 现在,它通过传递对象包装类型作为最后一个参数来完成,但这似乎不是很干净。我想保留纯矩阵表示法。

3 个答案:

答案 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(){...}
}

结合这两种方法可能有一种可怕的,可怕的,令人敬畏的方式,但我认为在使用代码时它实际上并没有帮助。我可以回复你。