c++面向对象特性之继承(1)
总结一下c++关于继承的学习
1.为什么使用继承?
在进行类的创建时,有很多类之间,存在着包含关系,那么当创建了一个大的类以后,再创建细化后的一个类,该细化后的类除了拥有自己特殊的成员函数外,他也具有大类中具有的基本成员函数,那么,我们没有必要再将这些大类中已经实现过的类再去写一遍,直接使用继承这个特性,可以省去很多麻烦。
2.举例说明:
这是一个Person类
#include<string>
using namespace std;
class Person
{
public:
void eat();
string m_strName;
string m_strGender;
string m_strAge;
};
再定义一个worker类
#include<string>
using namespace std;
class Worker
{
public:
void eat();
void work();
string m_strName;
string m_strGender;
string m_strAge;
int m_iSalary;
}
可以看到,worker类拥有person类所有的成员函数和成员变量,同时还有i_salary变量和work()成员函数,那么如果使用继承,worker类就可以直接这样写出来:
class worker:public Person
{
public:
void work();
int m_iSalary;
}
可以看到只需写出worker类特有的内容即可,因此,worker类和Person类存在继承关系。
worker类被称为 派生类 或者是子类
Person类被称为 基类 或者是父类
worker类创建成功,其中的person类对象虽然省略掉没写,但是依然是存在的。如下图(转载于慕课网james_yuan的c++课程):
worker中 m_strName m_iAge虽然没有单独申明,但是你创建一个对象,也还是可以调用这几个属性的,让我们用代码来验证一下。
#include "person.h"
#include<iostream>
using namespace std;
Person::Person()
{
cout<<"Person()"<<endl;
}
Person::~Person()
{
cout<<"~Person()"<<endl;
}
void Person::eat()
{
cout<<"eat()"<<endl;
}
//worker.cpp
#include"worker.h"
#include <iostream>
using namespace std;
worker::worker()
{
cout<<"worker()"<<endl;
}
worker::~worker()
{
cout<<"~worker"<<endl;
}
void worker::work()
{
cout<<"work()"<<endl;
}
//main.cpp
#include "worker.h"
#include <iostream>
using namespace std;
int main()
{
worker *p = new worker();
delete p;
p = NULL;
system("pause");
return 0;
}
我将person类和worker类都写出其构造函数和析构函数,其内容都为打印函数名,这样可以直接反映继承了person类的worker类,他们两者之间的构造函数,析构函数的运行顺序是怎么样的,运行后如下图所示:
先是基类构造函数->派生类构造函数->派生类析构函数->基类析构函数
那么我们可以调用person类中存在,worker类声明时省略的函数吗?
int main()
{
worker *p = new worker();
p->m_strName = "jiger";
p->m_strAge = "21";
cout<<p->m_strName<<endl;
cout<<p->m_strAge<<endl;
delete p;
p = NULL;
system("pause");
return 0;
}
访问并修改Name和Age变量,输出:
成功修改!