3

我是新手,正在学习 C++。我有一个关于类的函数重载的问题。

除了函数名外,我在下面有两个完全相同的代码。一个只是一个函数,另一个是运算符。

#include <iostream>

using std::cout;
using std::endl;

class B;

class A {
  public:
    void test(A const &a) { cout << "AA" << endl; }
    void test(B const &b) { cout << "AB" << endl; }
};

class B : public A {
  public:
    void test(A const &a) { cout << "BA" << endl; }
};

int main() {
  B b1;
  B b2;
  b1.test(b2);
  return 0;
}

该程序打印

BA

这是另一个程序。

#include <iostream>

using std::cout;
using std::endl;

class B;

class A {
  public:
    void operator=(A const &a) { cout << "AA" << endl; }
    void operator=(B const &b) { cout << "AB" << endl; }
};

class B : public A {
  public:
    void operator=(A const &a) { cout << "BA" << endl; }
};

int main() {
  B b1;
  B b2;
  b1.operator=(b2);
  return 0;
}

该程序打印

AA

这两个程序之间的唯一区别是函数名:test 和 operator=。我不明白为什么 C++ 会这样。有什么我想念的吗?

我在 mac OS X 8.2 下用 g++ 版本的 4.2.1 编译这个程序

谢谢!

4

1 回答 1

3

在您的第一种情况下,它不是关于overloading,这两个test函数在A重载,但是,testBAname hiding因为B重新定义了testoverloading处理同一范围内的函数,name hiding讨论类层次结构。

所以在第一种情况下

b1.test(b2);

b2是 的对象B,中的test函数B需要类的 const 引用,A在这种情况下是可以的,所以它会输出“BA”。

在第二种赋值运算符的情况下,您没有创建要赋值给的赋值运算符BB因此编译器为您创建了一个。编译器创建的是调用赋值运算符A。因此,AA被打印。

如果operator=在 B 中添加另一个:

void operator=(B const &B) { cout << "BB" << endl; }

您将在赋值运算符的情况下看到“BB”打印出来,因为在这种情况下,编译器不会为您生成赋值运算符。

于 2013-03-30T03:20:52.757 回答