4.1.2 隐藏
父类A 中 void ABC( ),子类B中也有相同的void ABC(),则访问就只能访问子类B的ABC(),父类A中的ABC()像是被隐藏了,所以叫做隐藏
总结为: 父子关系 成员同名 隐藏
class person
{
public:
void play();
protected:
string m_strName;
};
class Soldier:public person
{
public:
void play();
void work();
protected:
int m_iCode;
};
int main()
{
Soldier soldier;
soldier.play();
soldier.person::play();
return 0;
}
使用“ ”去包含头文件是在程序的同目录下去搜索文件,使用< >包含头文件,程序会自动搜索程序的默认库,所以会出现错误
当想使用父类中的数据成员或者成员函数时,需要在变量前面加 父类名::成员函数(数据成员)名 这样调用
4.1.3 Is - a
隐形眼镜也是眼镜,可以用子类的对象初始化父类的对象,不能用父类的对象初始化子类的对象,所以父类指针和引用来作为参数,可以用来接收子类的参数和对象
父类指针指向子类对象时只能指向父类中原有的对象,而不能指向子类独有的的数据对象或成员函数()
/*
公有继承:Is a
1定义一个Person类,要求含有m_strName,数据成员及构造函数和析构函数、play函数
2.定义一个Soldier类,含有数据成员m_iAge、构造函数、析构函数、work函数
3.定义函数test1(Person p) test2(Person &p) test3(Person *p) */
#include<iostream>
#include<stdlib.h>
#include"Soldier.h"
using namespace std;
void test1(Person p)
//实例化了临时对象
{
p.play();
}
void test2(Person &p)
//没实例化临时对象,相对test1,效率更高
{
p.play();
}
void test3(Person *p)
//没实例化临时对象,相对test1,效率更高
{
p->play();
}
int main()
{
Person p ;
Soldier s;
test3(&p);
test3(&s);
system("pause");
return 0;
}
Person.h
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(string name = "Jim");
virtual ~Person();
void play();
protected:
string m_strName;
};
Person.cpp
#include<iostream>
#include"Person.h"
using namespace std;
Person::Person(string name)
{
m_strName = name;
cout << "Person()" << endl;
}
Person::~Person()
{
cout << "~Person()" << endl;
}
void Person::play()
{
cout << "Person--play()" << endl;
cout << m_strName << endl;
}
Soldier.h
#include <iostream>
#include"Person.h"
using namespace std;
class Soldier:public Person
{
public:
Soldier(string name ="James",int age = 20);
virtual ~Soldier();
void work();
protected:
int m_iAge;
};
Soldier.cpp
#include<iostream>
#include"Soldier.h"
#include<stdlib.h>
using namespace std;
Soldier::Soldier(string name , int age)
{
m_strName = name;
m_iAge = age;
cout << "Soldier()" << endl;
}
Soldier::~Soldier()
{
cout << "~Soldier()" << endl;
}
void Soldier::work()
{
cout << m_iAge << endl;
cout << "Soldier--work()" << endl;
cout << m_strName<< endl;
}
若要通过父类指针指向子类的内存,并且通过父类指针释放内存空间的话,用virtual 虚析构函数,来相互继承
巩固练习:定义两个类,基类是人类,定义数据成员姓名(name),及成员函数void attack( ). 士兵类从人类派生,定义与人类同名的数据成员姓名(name)和成员函数void attack().通过对同名数据成员及成员函数的访问理解成员隐藏的概念及访问数据的方法
/*
公有继承:Is a
1定义一个Person类,要求含有m_strName,数据成员及构造函数和析构函数、play函数
2.定义一个Soldier类,含有数据成员m_iAge、构造函数、析构函数、work函数
3.定义函数test1(Person p) test2(Person &p) test3(Person *p)*/
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
class Person
{
public:
string m_strName;
void attack()
{
cout << "attack" << endl;
};
};
class soldier :public Person
{
public:
string m_strName;
void attack()
{
cout << "fire!!!" << endl;
};
};
int main()
{
soldier s;
s.m_strName = "tomato";
s.Person::m_strName = "Jim";
cout << s.m_strName << endl;
cout << s.Person::m_strName << endl;
system("pause");
return 0;
}