c ++抽象类中的重载运算符

时间:2014-02-28 11:09:43

标签: c++ class interface casting

我有以下界面:

class A
{
  public:
    virtual A * operator+(const A &rhs) const = 0;
}

抽象类:

class B : public A
{
  public:
    B(int val)
    {
      this->val = val;
    }

    virtual A * operator+(const A &rhs) const
    {
      return (new B(this->val + rhs.val));
    }
    int val;
}

此外,我有这个班:

class C
{
  public:
    void add();
  private:
    std::stack<A *> Astack;
}

无法修改operator + prototype。

我的问题是我无法创建添加功能。我试过这个:

void    C::add()
{
  B first = *dynamic_cast<B *>(this->Astack.top()); // Error here
  this->Astack.pop();
  B second = *dynamic_cast<B *>(this->Astack.top()); // And here
  this->Astack.pop();
  B * res = first + second;
  this->Astack.push(res);
}

但是我的编译器告诉我: 错误:初始化时无法将B转换为A *。 事实上,我没有获得B来添加它们。

3 个答案:

答案 0 :(得分:2)

操作员不能是虚拟的(好吧,技术上他们可以,但它是灾难的处方,导致切片,客户端代码中奇怪的算术表达式以及无可救药的可爱小海豹的谋杀)。

您的C::add应该与此类似:

void C::add() // assuming implementation is supposed to sum instances and 
              // add replace the contents of Astack with the sum
{
    A* x = Astack.top();
    Astack.pop();
    while(!Astack.empty()) {
        A* y = Astack.top();
        Astack.pop();

        A* z = (*x) + (*y);
        delete x;
        delete y;

        x = z; // latest result will be in x on the next iteration
    }
    Astack.push(x);
}

另外,你的老师应该学习不滥用内存分配,不滥用虚函数,不强加虚拟操作符以及C ++类接口设计中的好坏实践 - 包括重载算术运算符的正确函数签名。)

答案 1 :(得分:0)

firstsecond都是指针变量和保持地址。你不能添加两个地址。

first + second没有调用运算符重载函数,请尝试使用*first + *second

答案 2 :(得分:0)

B * res = first + second;  // Error here !

在这里,您尝试将A *指针(由operator +返回)分配给B *指针。你必须施展结果。这样的事情:

B * res = dynamic_cast<B*>(first + second);

编辑:不是说你应该以这种方式使用运算符重载。 utnapistim给出了一个很好的答案。