【发布时间】:2012-01-07 18:49:42
【问题描述】:
在这个例子中我应该怎么做才能触发正确的操作符:
#include<iostream>
using namespace std;
class A
{
public:
virtual void operator/(A& a){cout << "class A";}
};
class B : public A
{
public:
void operator/(B& b){cout << "class B";}
};
int main()
{
A* a = new B;
A* b = new B;
*a / *b;
return 0;
}
输出是"class A",但应该是"class B"。
我该如何解决这个问题?谢谢。
编辑:根据答案...我应该为每个派生类执行此操作:
class A
{
public:
virtual void operator/(A& a){cout << "class A";}
};
class B : public A
{
public:
virtual void operator/(A& a) override {cout << "class B";}
};
class C : public B
{
public:
virtual void operator/(A& a) override {cout << "class C";}
};
class D: public C
{
public:
void operator/(A& a) override {cout << "class D";}
};
int main()
{
A* a = new D;
A* b = new D;
*a / *b;
//...
}
【问题讨论】:
-
我认为您提出的答案仍然是错误的。我认为你应该专注于澄清这个问题。例如,您想打印“class X”,其中 X 是与 both 操作数兼容的最派生类。这是你想说的吗?
-
@Aaron 例如:指向 A 类的指针是指向 X 类的指针(大多数派生) A* a = new X;这就是我感到困惑的地方......意味着我们必须永远覆盖所有类,因为指向类 A 的指针有时可能是指向同一个 porgram 中的 B 的指针...... A* a = new B;
-
请专注于阐明你的目标。给定 *x / *y,您是否希望确定与这两个操作数兼容的最派生类?一旦你明确了你的目标,我们都可以尝试解决它。
-
致所有相关人员。我认为我们面临三个任务。首先:在此处确定最终的目标 - 定义(用简单的英语)所需的行为。第二:解释为什么问题中的代码未能达到预期的行为。第三:编写正确的代码。
-
我的目标很简单:“有没有其他方法可以在我编辑的问题中以更短的方式或更有效的方式实现相同的目标”。谢谢。 @Aaron我想划分类new D和new D,它们的指针指向A类(大多数基类)
标签: c++ inheritance operator-keyword