一、继承是面向对象复用的重要手段。通过继承定义一个类继承是类型之间的关系建模,共享公有的东西,
实现各自本质不同的东西。
三种类成员访问限定符1.public(公有)2.protected(保护)3.private(私有)。
三种继承关系1.public(公有继承)2.protected(保护继承)3.private(私有继承)。
class Person //基类/父类
{
public:
void Display()
{
cout << _name << endl;
}
protected:
char*_name;
};
class Student :public Person //子类/派生类(继承父类)
{
protected:
int _num;
};
继承是一种复用的手段,在继承关系里基类的成员类的成员派生类的成员,由此大道复用的目的。
继承方式 | 基类的public 成员 | 基类的protected 成员 | 基类的private 成员 | 继承引起的访问控制 关系变化概括 |
public继承 | 仍为public成员 | 仍为protected成员 | 不可见 | 基类的非私有成员 在子类访问属性都 不变 |
protected继承 | 变为protected成员 | 变为protected成员 | 不可见 | 基类的非私有成员 都成为子类的保护 成员 |
private继承 | 变为private成员 | 变为private成员 | 不可见 | 基类中的非私有成 员都成为子类的私 有成员 |
1.基类的私有成员在派生类中是不能被访问的,如果一些基类成员不想被基类对象直接访问,但是需要在派生类中
访问,就定义为保护成员,可以看出保护成员限定符是因继承才出现的。
2.public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也都是父类对象。
3.protected/private继承是一个实现继承,基类的部分成员并未完全成为子类接口的一部分,是 has-a的关系原则,所以
非特殊情况下不会使用这两种继承关系,在绝大多数的情况下使用的都是公有继承。
4.不管哪种继承方式,在派生类内部都可以访问基类的公有成员和保护成员但是基类的私有成员存在但是在子类中不
可见(不能访问)。
5.使用关键字class时默认的继承方式是private,使用struct默认的继承方式是public,不过最好现实的写出继承方式。
6.在实际运用中一般使用都是public继承,及少使用protected/private继承。
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
void Display()
{
cout << _name << endl;
}
protected:
string _name;
private:
int _age;
};
class Student :public Person
{
protected:
int _num;
};
int main()
{
return 0;
}
二、继承与转换--赋值兼容规则--public继承
1.子类对象可以赋值给父类对象(切片/切片)
2.父类对象不能赋值给子类对象
3.父类的指针/引用可以指向子类对象
4.子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
void Display()
{
cout << _name << endl;
}
protected:
string _name;
private:
int _age;
};
class Student :public Person
{
protected:
int _num;
};
void Test()
{
Person p;
Student s;
p = s;//1.子类对象可以赋值给父类对象
//2.父类对象不能赋值给子类对象(s=p)
Person*p1 = &s;
Person&r1 = s;//3.父类的指针/引用可以指向子类对象
Student*p2 = (Student*)&p;/*4.子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)*/
Student&r2 = (Student&)p;
}
int main()
{
return 0;
}
继承体系中的作用域
1.承体系中基类和派生类都有独立的作用空间
2.子类和父类中有同名成员,子类成员将屏蔽父类成员的直接访问
3.注意在实际中在继承体系里面最好不要定义同名的成员。
派生类的六个默认成员函数
在继承体系里面,在派生类中如果没有显示定义这六个默认成员函数,编译系统则会默认
合成这六个默认成员函数。
1.构造函数2.拷贝构造函数3.析构函数4.赋值操作符的重载5.取地址操作符的重载6.const修饰的取地址操作符重载
单继承&多继承
1.单继承 :一个字类只有一个直接父类时称这个继承关系为单继承
2.多继承:一个子类有两个或者两个以上的直接父类时称这个继承关系为多继承