Hello,我是修齊。
学习C++的第一百零一十天,将近五一假期了,不浪漫亦是罪名,男生今年不能再挨批斗了,放假就得好好陪陪身边的人浪漫浪漫,生活,加油,学习加油。
在这里记录一些学习的东西和学习的心情,内容主要是一些自己学习整理的小笔记。
1.一个接口,多种实现:同一种事务表现出来的多种形态
2.面向对象的多态性可分为四类:重载多态、强制多态、包含多态、参数多态
3.专用多态:重载多态和强制多态;通用多态:包含多态和参数多态
4.包含多态:定义于不同类中的同名成员函数的多态行为,主要通过虚函数来实现
5.实现角度分:编译时的多态和运行时的多态
6.编译时的多态:编译的过程中确定同名操作的具体操作对象
7.运行时的多态:程序运行过程中动态地确定操作所针对的具体对象
8.联编:确定操作的具体对象的过程叫联编
9.联编:计算机程序自身彼此关联的过程,把一个标识符名和一个存储地址联系在一起的过程(面向对象的术语:把一条消息和一个对象的方法相结合的过程)
10.联编进行阶段不同分两种联编方法:静态联编和动态联编,对应多态的两种实现方式
11. 多态作用:统一的标识完成函数功能,减少程序中标识符的个数
12. 多态性提供把接口和实现分开的另一种方法
13. 多态是一种行为的封装,只需早知道操作对象所能够做的事情(接口),具体怎么做由多态自己去决定
1.没有使用多态的情况下,结果输出:animal breathe。主函数先定义了fish类的对象fh,接着定义指向animal类的指针变量pAn,将fh的地址赋给了指针变量pAn,再利用该变量调用pAn->breathe()。
2.编译器编译时,对每个对象调用的函数的地址进行早期绑定(early binding),当fish类的对象fh的地址赋给pAn时,编译器进行了类型转换,默认变量pAn保存的就是animal对象的地址,当执行pAn->breathe()时,调用的就是animal对象的breathe函数。
3.构造fish类的对象时,系统调用基类animal类的构造函数去构造animal类的对象,然后再调用fish类的构造函数完成新增部分的构造,两个加起来才拼接成完整的对象。
4.当fish类的对象转换为animal类型时,该对象被认为时animal对象所占内存部分,当利用转换类型后的对象指针调用它的方法时,也就是调用它所在内存中的方法。输出:animal breathe
class animal
{
public:
void sleep()
{
cout << "animal sleep"<
cout<<"animal breathe"<
public:
void breathe()
{
cout<<"fish bubble"<
fish fh;
animal *pAn=&fh;
pAn->breathe();
}
三、函数重载
1.静态联编支持的多态性称为编译时的多态性或静态多态性
2.静态多态性:确定同名操作的具体操作对象的过程是在编译过程中完成的
3.实现编译时的多态性的方式:函数重载、运算符重载
4.动态联编支持的多态性称为:运行时的多态性或动态多态性
5.动态多态性:确定同名操作的具体操作对象的过程是再运行过程中完成的
6.实现运行时的多态性的方式:继承、虚函数
7.函数重载=多态函数,是实现编译时的多态性的形式之一(虚函数应该也是一个,猜的。)
8.函数重载作用:能用同一个名字来访问一组相关的函数,提高程序的灵活性
9.函数重载时,函数名相同,函数所带的参数个数和数据类型不同(1.参数个数或类型有所差别的重载;2.函数参数完全相同但属于不同的类)
10.区分调用哪个类的同名函数方法:(1.对象名区别:函数名前加上对象名来限制“对象名.函数”;2.类名和作用域运算符::加以区别:函数名前加“类名::”来限制“类名::函数名”)
class point//定义基类point
{
int x,y;
public:
point(int xx,int yy)//定义基类构造函数
{
x=xx;
y=yy;
}
double area()//定义基类的成员函数
{
return 0.0;
}
};
class circle:public point//派生类公有继承于基类
{
int t;
public:
circle(int xx,int y,int rr):point(xx,yy)//定义派生类构造函数
{
r=rr;
}
double area()//同名函数
{
return 3.1416*r*r;
}
};
void main()
{
point pob(15,15);//创建基类对象
circle cob(20,20,10);//创建派生类对象
cout<<"pob.area()=“<
四、虚函数
1.虚函数时重载的另一种形式,实现动态的重载,函数调用与函数体之间的联系是在运行时才建立(动态联编)
2.虚函数是实现运行时的多态(动态多态性)的一个重要方式
3.一般对象的指针间没有联系,彼此独立,不能混用
4.派生类由基类派生,它们之间有继承关系,由此,指向基类和派生类的指针之间有一定的联系
四、虚函数的引入
1.没有使用虚函数,执行语句:objp=&obj1之后,指针已经指向了对象obj1,但调用的函数仍是基类对象的函数而不是派生类对象的函数
2.原本想通过使用对象指针达到动态调用方式(当指针指向不同的对象时,)执行不同操作目,但没有达到
3.输出结果:
base:3 4
base:1 2
4.原因:调用的成员函数在编译时静态联编了,所以引入虚函数概念
class base//定义基类base
{
private:
int x,y;
public:
base(int xx-0,int yy-0)//定义构造函数
{
x=xx;//定义基类私有成员
y=yy;
}
void disp()//定义成员函数
{
cout<<"base:"<
private://定义派生类的私有成员
int z;
public:
base1(int xx,int yy,int zz):base(xx,yy)//定义派生类的构造函数
{
z=zz;
}
void disp()//定义同名函数
{
cout<<"base:"<
base obj(3,4),*objp;//创建基类的对象和对象指针
bse1 obj1(1,2,3,4);//创建派生类的对象
objp=&obj;//对象指针指向基类
objp->disp();//调用基类成员函数
objp=&obj1;//对象指针指向派生类
objp->disp();//调用派生类成员函数
}
五、待续
1.定义虚函数、使用虚函数
2.多重继承和虚函数
3.还没完,我还会回来的。。。哈哈哈
上述内容如有侵权,联系即删。
感谢阅读-感谢支持



