我有以下界面:
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
来添加它们。
答案 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)
first
和second
都是指针变量和保持地址。你不能添加两个地址。
first + second
没有调用运算符重载函数,请尝试使用*first + *second
答案 2 :(得分:0)
B * res = first + second; // Error here !
在这里,您尝试将A *指针(由operator +返回)分配给B *指针。你必须施展结果。这样的事情:
B * res = dynamic_cast<B*>(first + second);
编辑:不是说你应该以这种方式使用运算符重载。 utnapistim给出了一个很好的答案。