在派生类实例之间使用在基类中定义的运算符

时间:2014-05-04 16:10:01

标签: c++

我有两个类,Base和Derived。 Base定义了一个运算符(这里是operator +),我想在Derived类的实例之间使用它,但是我无法设法解决这个问题。

这里有一些解释问题的最小代码:

class Base{
  public:
    Base(int X){ x = X; }

    Base operator+(const Base& rhs){
        return Base(x + rhs.x);
    }

    int x;
};

class Derived : public Base{
  public:
    using Base::Base;
};

int main(){
  Derived der1(0);
  Derived der2(0);

  Derived der3 = der1 + der2;

  return 0;
}

编译器说:

main.cpp: In function ‘int main()’:
main.cpp:21:23: error: conversion from ‘Base’ to non-scalar type ‘Derived’ requested
   Derived der3 = der1 + der2;

Derived类不需要具有除Base继承的属性之外的任何属性。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是重复出现的模板模式的常见用例。一个例子是

template<typename T>
class Base
{
public:
    Base(int X) { x = X; }

    friend T operator+(const Base& lhs, const Base& rhs)
    {
        return T(lhs.x + rhs.x);
    }

    int x;
};

class Derived : public Base<Derived>
{
public:
    Derived(int arg) : Base(arg) { }
    using Base::Base;
};

int main()
{
    Derived der1(1);
    Derived der2(2);

    Derived der3 = der1 + der2;

    return 0;
}

这就像so

朋友名称注入(或Barton Nackman技巧)用于在模板化类型的实例化时生成函数。以上是设计可能的粗略草图,但我应该引导您完成调用+运算符的过程。

  1. der1der2转换为对基类的引用
  2. 选择了base的运算符+的主体(即使它位于不同的命名空间中,依赖于参数的查找会启动,我们会有解决方案)
  3. 运算符构造一个T,在这种情况下,其总和为Derived

    (lhs.x + rhs.x)
    
  4. 该对象用于初始化der3