思考
子类中是否可以定义父类中的同名成员?
47-1例:
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
int mi;
};
class Child : public Parent
{
public:
int mi;
};
int main()
{
Child c;
c.mi = 100; // mi 究竟是子类自定义的,还是从父类继承得到的?
return 0;
}
父子间的冲突
子类可以定义父类中的同名成员
子类中成员将隐藏父类中的同名成员
父类中的同名成员依然存在于子类中
通过作用域分辨符(::)访问父类中的同名成员
47-2例:
#include <iostream>
#include <string>
using namespace std;
namespace A
{
int g_i = 0;
}
namespace B
{
int g_i = 0;
}
class Parent
{
public:
int mi;
Parent()
{
cout<<"Parent:"<<"&mi"<<&mi<<endl;
}
};
class Child : public Parent
{
public:
int mi;
Child()
{
cout<<"Child:"<<"&mi"<<&mi<<endl;
}
};
int main()
{
Child c;
c.mi = 100; // mi 究竟是子类自定义的,还是从父类继承得到的?
c.Parent::mi = 1000;
cout << "&c.mi = "<<&c.mi<<endl;
cout << "c.mi = "<<c.mi<<endl;
cout << "&c.Parent::mi = "<<&c.Parent::mi<<endl;
cout << "c.Parent::mi = "<<c.Parent::mi<<endl;
return 0;
}
输出:
Parent:&mi0xbfed2d68
Child:&mi0xbfed2d6c
&c.mi = 0xbfed2d6c
c.mi = 100
&c.Parent::mi = 0xbfed2d68
c.Parent::mi = 1000
重载
类中的成员函数可以进行重载
1.重载函数的本质为多个不同的函数
2.函数名和参数列表是唯一的标识
3.函数重载必须发生在同一个作用域中
父子间的函数重载
47-3.cpp
#include <iostream>
#include <string>
using namespace std;
namespace A
{
int g_i = 0;
}
namespace B
{
int g_i = 0;
}
class Parent
{
public:
int mi;
int 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)
{
mi += (x+y+z);
}
};
int main()
{
Child c;
c.mi = 100; // mi 究竟是子类自定义的,还是从父类继承得到的?
c.Parent::mi = 1000;
cout << "c.mi = "<<c.mi<<endl;
cout << "c.Parent::mi = "<<c.Parent::mi<<endl;
c.Parent::add(1);
c.Parent::add(2,3);
c.add(4,5,6);
cout << "c.mi = "<<c.mi<<endl;
cout << "c.Parent::mi = "<<c.Parent::mi<<endl;
return 0;
}
输出结果:
c.mi = 100
c.Parent::mi = 1000
c.mi = 115
c.Parent::mi = 1006
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。