一.什么是继承
1.什么是继承
c++中的继承和我们生活中所说的继承遗产,继承家业不是一个意思。c++中的继承指的是:面向对象程序设计中使代码可以复用的重要手段,它允许程序员在原有类特性的基础上进行扩展增加功能。这样产生的新的类叫派生类。
2.为什么要继承
当我们定义一个人类的类,然后定义了一个一个工人类的时候,我们发现工人类具有比人类更多的属性,而且他也具有了所有人类的属性,那么我们能不能在定义工人类的时候可不可以不重复去定义那么多属性呢!那么就要用到继承了!
3.继承的定义
我们定义工人类的时候用class Worker:public Person这样就不用重复加上人类的重复属性了!
二.继承方式
1.公有继承
public成员的继承方式:
protected成员的继承方式:
private成员的继承方式:
特点总结:
2.保护继承和私有继承
3.隐藏
如果我们先定义了父类A再定义了子类B,但是他们之中都有一个同名的成员函数。当子类继承了父类之后也有了父类中的这个函数,这时父类中的这个函数就会被隐藏。
当我们直接调用的时候就是调用的子类中的成员函数,但我们也可以调用到父类中的成员函数,但是要通过下图中的方式soldier.Person::play();
4.Is-a的关系
当我们士兵继承人类的时候,我们就可以说士兵是(is a)人类,这样完全是没有问题的。看下图,我们可以用子类的对象给父类的对象赋值,同样可以用父类的指针指向子类。但是反过来就不行了!
存储结构:
第一种情况:将子类的对象赋值给父类的对象或者是用子类的对象初始化父类的对象,本质就是将子类从父类中继承的成员赋值给父类的对象,子类中的其他成员此时就会被截断。
第二种情况:用父类的指针指向一个子类的对象,指针只能访问到父类原来拥有的成员,无法访问子类独有的成员。
三.多继承和多重继承
1.定义
2.虚继承
虚继承的来由:当下图这样的继承情况下,既有多继承又有多重继承,这样类D里面就会出现两个类A的数据,出现成员臃余,这个时候就要使用虚继承来避免这个问题!
虚继承的定义方式
3.代码示例
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
* 定义人类: Person
*/
class Person
{
public:
Person()
{
cout << "Person" << endl;
}
~Person()
{
cout << "~Person" << endl;
}
void eat()
{
cout << "eat" << endl;
}
};
/**
* 定义工人类: Worker
* 虚继承人类
*/
class Worker :virtual public Person
{
public:
Worker(string name)
{
m_strName = name;
cout << "Worker" << endl;
}
~Worker()
{
cout << "~Worker" << endl;
}
void work()
{
cout << m_strName << endl;
cout << "work" << endl;
}
protected:
string m_strName;
};
/**
* 定义儿童类:Children
* 虚继承人类
*/
class Children : virtual public Person
{
public:
Children(int age)
{
m_iAge = age;
cout << "Children" << endl;
}
~Children()
{
cout << "~Children" << endl;
}
void play()
{
cout << m_iAge << endl;
cout << "play" << endl;
}
protected:
int m_iAge;
};
/**
* 定义童工类:ChildLabourer
* 公有继承工人类和儿童类
*/
class ChildLabourer:public Worker,public Children
{
public:
ChildLabourer(string name, int age):Worker(name),Children(age)
{
cout << "ChildLabourer" << endl;
}
~ChildLabourer()
{
cout << "~ChildLabourer" << endl;
}
};
int main(void)
{
// 用new关键字实例化童工类对象
ChildLabourer *p=new ChildLabourer("caicai",23);
// 调用童工类对象各方法。
p->eat();
p->work();
p->play();
delete p;
p = NULL;
return 0;
}