文章目录
- 一、继承和派生
- 二、多态与虚函数
一、继承和派生
继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类)。
目的:提升代码的重用性
派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。
派生类一经定义后,可以独立使用,不依赖于基类。
派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public 。
在派生类的各个成员函数中,不能访问基类中的private成员。
格式:
class 派生类名 :public 基类名
{
};
内存空间:
派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。
举例:
#include<iostream>
#include<string>
using namespace std;
class CStudent{
private:
string name;
string id;//学号
char gender;//‘F’表示女‘M’表示男
int age;
public:
void PrintInfo();
void SetInfo(const string&name_,const string &id_,int age_,char gender_);
string GetName(){return name;}
};
class CUndergraduateStudent:public CStudent//本科生类
{
private:
string department;
public:
void QualifiedForBaoYan(){
cout<<"qulified for baoyan"<<endl;
}
void PrintInfo(){
CStudent::PrintInfo();//调用基类函数
cout<<"Department:"<<department<<endl;
}
void SetInfo(const string&name_,const string &id_,int age_,char gender_,const string&department_){
CStudent::SetInfo(name_,id_,age_,gender_);
department=department_;
}
};
void CStudent::PrintInfo(){
cout<<"Name:"<<name<<endl;
cout<<"ID:"<<id<<endl;
cout<<"Age:"<<age<<endl;
cout<<"Gender:"<<gender<<endl;
}
void CStudent::SetInfo(const string&name_,const string &id_,int age_,char gender_){
name=name_;
id=id_;
age=age_;
gender=gender_;
}
int main(){
CUndergraduateStudent s2;
s2.SetInfo("Harry Potter","118829212",19,'M',"Computer Science");
cout<<s2.GetName()<<" ";
s2.QualifiedForBaoYan();
s2.PrintInfo();
return 0;
}
运行结果:
二、多态与虚函数
在类的定义中,前面有virtual 关键字的成员函数就是虚函数。
class base {
virtual int get();
};
int base::get(){ }
virtual关键字只用在类定义里的函数声明中,写函数体时不用。
构造函数和静态成员函数不能是虚函数。
区别:虚函数可以参与多态,普通函数不行。
多态的表现形式一:
派生类的指针可以赋给基类指针。
通过基类指针调用基类和派生类中的同名虚函数时:
(1)若该指针指向一个基类的对象,那么被调用是基类的虚函数;
(2)若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数。
多态的表现形式二:
派生类的对象可以赋给基类引用。
通过基类引用调用基类和派生类中的同名虚函数时:
(1)若该引用引用的是一个基类的对象,那么被调用是基类的虚函数;
(2)若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数。
目的:增强程序的可扩充性。
举例:
#include<iostream>
using namespace std;
class A{
public:
virtual void Print(){cout<<"A:Print"<<endl;}
};
class B:public A{
public:
virtual void Print(){cout<<"B:Print"<<endl;}
};
class C:public A{
public:
virtual void Print(){cout<<"C:Print"<<endl;}
};
class D:public B{
public:
virtual void Print(){cout<<"D:Print"<<endl;}
};
int main(){
A a;B b;C c;D d;
A* pa=&a;
B* pb=&b;
C* pc=&c;
D* pd=&d;
pa->Print();
pa=pb;
pa->Print();
pa=pc;
pa->Print();
pa=pd;
pa->Print();
return 0;
}
运行结果: