8.1继承与派生的概念
继承:一个新类从已有的类那里获得其已有的特性,称为类的继承。
单继承:一个派生只从一个基类派生 多重继承:一个派生类有两个或多个基类
派生类(子类)是基类(父类)的具体化,而基类则是派生类的抽象。
派生类声明
形式: class 派生类名:继承方式 基类名{ 派生类型增加成员 }; 继承方式不写则默认private
继承方式 | 访问属性 |
---|
公用继承 | 基类的public和protected在派生类中保持原属性,privat仍为基类私有 | 私有继承 | 基类的public和protected在派生类中成为private,privat仍为基类私有 | 受保护的继承 | 基类的public和protected在派生类中成为protected,privat仍为基类私有 |
保护成员:不能被外界引用,但可以被派生类的成员引用
派生类的构成
1)从基类接收成员。接收基类全部的成员(除构造函数和析构函数) 2)调整从基类接收的成员:改变访问属性;重声明(如果是函数,参数必须完全相同) 3)在声明派生类时增加的成员
8.2 派生类的构造函数与析构函数
构造函数形式: 派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数名) { 派生类中新增 }
class Student:public People{
public:
Student(int s,string na,string num,int classroom):People(s,na){}
构造函数调用顺序: 1、调用基类构造函数 2、调用子对象构造函数 2、再执行派生类构造函数本身 析构函数则相反。
8.3 多重继承与派生类的成员标识
多继承的概念
一个派生类有两个或多个基类的称为多重继承。 继承方式包括:public,private,protected(默认private)
class Student:public People{
public:
Student(int n,int a):People(n){
age = a;
}
};
public: 基类的public和protected在派生类中保持原有访问属性,其private仍为基类私有。 private: 基类的public和protected在派生类中成了私有成员,其private仍为基类私有。 protected: 基类的public和protected在派生类中成了保护成员,其private仍为基类私有。
protected的意思是,不能被外界引用,但可以被派生类的成员引用。
多重继承的二义性问题如何解决
可以通过直接派生类名来指出要访问的是哪一个派生类中的基类成员。
c1.A::display();
8.4 虚基类
多继承中的虚基类的特点与使用
虚基类使得在继承间接共同基类时只保留一份成员。 注意:虚基类不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。
class A{
A(int i){}
};
class B:virtual public A{
B(int n):A(n){}
};
class C:virtual public A{
C(int n):A(n){}
};
class D:public B,public C{
D(int n):A(n),B(n),C(n){}
};
在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化。
8.5 多态性与虚函数
虚函数的特点与使用
virtual
虚函数就是在基类声明函数时虚拟的,并不是实际存在的函数,然后再派生类中才正式定义此函数。 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
虚函数、纯虚函数、抽象类 抽象类:含有纯虚函数的类,也叫抽象基类
calss Shape{
public:
virtual float area() const {return 0;}
virtual void shapeName() const = 0;
}
如何实现动态多态性
多态性:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。 静态多态性:通过重载函数实现。编译时的多态性。 动态多态性:通过虚函数实现的。运行时的多态性。
静态关联:在编译时即可确定其调用的虚函数属于哪一个类。例:函数重载 动态关联:在运行阶段把虚函数和类对象“绑定”在一起。
函数模板和类模板的使用和编写
template<typename T>
T max(T a,T b,T c){
if(b>a)a=b;
if(c>a)a=c;
return a;
}
int main(){
int i1=10,i2=15,i3=5;
max(i1,i2,i3);
}
template<class numtype>
class Compare{
private:
numtype x,y;
public:
Compare(numtype a,numtype b){
}
numtype max(){
return (x>y)?x:y;
}
};
int main(){
Compare<int> com(3,5);
}
类模板如何实例化,如何创建对象
见上条
函数模板和模板函数、类模板和模板类的区别
函数模板、类模板:重点是模板
template<typename T>
template<class numtype>
模板函数、模板类:重点是函数、类
max(i1,i2,i3);
Compare<int> com(3,5);
|