一、隐藏
如果基类和派生类中有同名的数据成员或者成员函数,在实例化派生类对象,调用该方法将会调用派生类的方法,而基类的方法虽然被继承但是看起来被隐藏一样
举例:
class People
{
public:
void eat(){cout<<"吃饭"<<endl;}
};
class Student:public People
{
public:
void eat(){cout<<"吃学校的饭菜"<<endl;}
};
当我们实例化一个Student对象 Student stu;
然后调用 stu.eat();
则会执行Student类中定义的成员函数
“吃学校的饭菜”
如果我们要调用People类中的eat
可以这样调用
stu.People::eat();
这样就会执行People中定义的成员函数
这种由于基类派生类同名而造成基类中的属性或者方法而导致无法直接调用基类属性或方法的关系叫做隐藏
二、is-a关系
基类和派生类的is-a关系,就是派生类对象也是一个基类对象
用上面People和Student的例子
可以理解为学生也是人
在程序中
我们可以用派生类对象实例化一个基类对象
我们也可以用基类指针指向派生类
举例
//沿用上面的People和Student
Student s1;
People p1= s1; //用派生类实例化基类
People *p2 = new Student;//基类指针指向派生类对象
is-a的存储结构
当用子类对象给父类对象赋值,或者用子类对象初始化父类对象,该父类对象只能接收他们共同拥有的部分,子类对象独有的数据成员不会接收
当用父类指针指向子类对象的时候,只能访问他们共有的数据成员和成员函数,无法访问子类独有的数据成员和成员函数
注意: