【发布时间】:2014-02-28 11:09:42
【问题描述】:
我有如下界面:
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+原型。
我的问题是我无法创建添加功能。我试过这个:
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添加它们。
【问题讨论】:
-
不要以这种方式实现运算符重载。请注意,您的添加已泄漏(考虑像
a + b + c这样的表达式,它会生成两个临时变量:它至少泄漏一个临时变量) -
我不得不这样做,这是学校的练习
-
好的,告诉你的老师不要把 C++ 当作 Java。在这种情况下,多态运算符重载根本没有意义。只需针对不同的情况实现不同的重载。 C++ 依赖于鸭子类型来处理这类事情:如果类型
T和U存在 operator+ 重载,则认为T和U是可添加的。您不提供额外的多态接口并让实现该接口的类被认为是可添加的。 -
是因为这个原因我得到了 -1 吗?
-
是的,它是我的。但不要难过:这真的是对你的老师的一票否决。请给他看这个帖子。
标签: c++ class interface casting