第47课.父子间的冲突(同名)
1.子类和父类中的同名成员变量
a.子类可以定义父类中的同名成员
b.子类中的成员将隐藏父类中的同名成员(同名覆盖)
c.父类中的同名成员依然存在于子类中
d.可以通过作用域分辨符(::)访问父类中的同名成员
eg:
Child c;
c.mi = 100; // 子类中的 mi
c.Parent::mi = 1000 // 父类中的 mi
2.子类和父类中的同名成员函数
问题:子类中定义的函数是否能重载父类中的同名函数?
答案:不能,子类和父类的作用域不同。函数重载必须发生在同一个作用域内。虽然子类是继承了父类,但这只是关系。在内存空间上来看,两个为两个独立的空间块,所运行的作用域不同。
a.子类中的函数将隐藏父类中的同名函数
b.子类无法重载父类中的同名函数
c.使用作用域分辨符(::)访问父类中的同名函数
d.子类可以定义父类中完全相同的成员函数(同名覆盖)
eg:
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
int mi;
void add (int v)
{
mi += v;
}
void add (int a, int b)
{
mi += (a + b);
}
};
class Child : public Parent
{
public:
int mi; //同名覆盖
void add (int x, int y, int z) //父类中有add()函数,这里同名覆盖掉所有父类中的同名变量
{
mi += (x + y + z);
}
};
int main ()
{
Child c;
c.mi = 100;
c.Parent::mi = 1000;
cout << "c.mi = " << c.mi << endl; // 100
cout << "c.Parent::mi = " << c.Parent::mi << endl; // 1000
c.Parent::add(1); // 这里调用的是父类中的add() mi = 1001
c.Parent::add(2, 3); // 这里调用的是父类中的add() mi = 1006
c.add(4, 5, 6); // 这里调用的是子类中的add() mi = 115
cout << "c.mi = " << c.mi << endl;
cout << "c.Parent::mi = " << c.Parent::mi << endl;
return 0;
}
附: