Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;抽象类中的重载运算符_C++_Class_Interface_Casting - Fatal编程技术网

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

C++ c++;抽象类中的重载运算符,c++,class,interface,casting,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

我有以下界面:

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;
}
C类
{
公众:
无效添加();
私人:
std::stack-Astack;
}
无法修改操作员+原型。

我的问题是无法创建add函数。我试过这个:

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);
}
void C::add()
{
B first=*dynamic_cast(this->Astack.top());//此处出错
这->Astack.pop();
B second=*dynamic_cast(this->Astack.top());//这里
这->Astack.pop();
B*res=第一+第二;
此->静止推送(res);
}
但我的编译器告诉我: 错误:无法在初始化时将
B
转换为
A*

事实上,我无法获得添加它们的
B

first
second
都是指针变量和保持地址。您不能添加两个地址

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

B * res = first + second;  // Error here !
在这里,您尝试将a*指针(由运算符+返回)分配给B*指针。你必须决定结果。诸如此类:

B * res = dynamic_cast<B*>(first + second);
B*res=dynamic_cast(第一次+第二次);

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

操作员不能是虚拟的(从技术上讲,他们可以,但这会导致灾难,导致客户机代码中出现切片、奇怪的算术表达式以及对可爱的海豹幼崽的无端谋杀)

您的
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++类接口设计中施加虚拟操作符和好的和坏的实践——包括正确的函数重载算术运算符签名。注意你的添加被泄露(考虑一个表达式,比如“代码> A+B+C < /Cord>”,它产生两个临时:它泄漏至少一个临时的)我被迫这样做,这是一个学校锻炼,告诉你的老师不要把C++当作java。多态运算符重载在这种上下文中毫无意义。只需针对不同的情况实现不同的重载。在这种情况下,C++依赖于鸭式输入:如果类型为“代码+ t//>代码”和“代码> U/CODE”,则操作符+过载。你不提供一个附加多态接口,让类实现这个接口就被认为是可添加的。这就是我得到-1的原因吗?是的,它是我的。但不要难过:这真的是对你老师的否决票。请给他看这个线程。在OP示例中,第一个和第二个是堆栈变量,因此运算符调用是正确的。@MatthiasBonora在我的帖子之后,这个问题被修改了。