我是新手并学习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编译该程序
谢谢!
答案 0 :(得分:3)
在您的第一个案例中,它不是overloading
,test
中的两个A
函数正在超载,test
B
和A
{1}} name hiding
是B
,因为test
重新定义了overloading
。 name hiding
处理同一范围内的函数b1.test(b2);
正在讨论类层次结构。
所以在第一种情况下
b2
B
是test
的对象,B
中的A
函数需要类B
的const引用,在这种情况下这是正常的,所以它将输出“BA”。
在第二个赋值运算符的情况下,您没有创建赋值运算符来将B
赋值给A
,因此编译器为您创建了一个。编译器创建的是调用AA
的赋值运算符。因此,会打印operator=
。
如果您在B中添加另一个void operator=(B const &B) { cout << "BB" << endl; }
:
{{1}}
您将在赋值运算符的情况下看到“BB”,因为在这种情况下,编译器不会为您生成赋值运算符。