C++学习笔记 联系客服

发布时间 : 星期六 文章C++学习笔记更新完毕开始阅读

同的函数,隐藏则一定是调用本地的成员(开始定义的指针的类型,而不是按赋给它值的类型来调用),即当定义了一个基类的指针,无论赋值给它的是基类,还是子类,它运行的结果都是按基类来的,这就是与覆盖的不同点)

(覆盖和多态总是联系在一起的,两个函数完全一样,参数也一样,只是基类带了virtual而已)

(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。 (在函数覆盖的情况下,编译器会在运行时根据对象的实际类型来确定要调用的函数)

c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

解读:在类里,public中的成员,可以被各种函数调用,首先是类的成员函数(在定义的时候,无需带以参数的形式引入,直接用就行),在类外时,当定义了一个对象之后,可以直接以 <对象名>.<成员函数名/数据>的形式来直接调用。

无论是public,private,还是protected类型,在类外要用它

们(包括在派生类里,在派生类里定义时,也是在定义的时候,把将基类当做形式参量来引入,再引用),不是在成员函数中定义的时候用它们,就必须要先定义个具体的对象,再以<对象名>.<成员函数名/数据>的形式来直接调用,不过这只是局限于public类型。而private和protected就要通过public型的成员函数来访问了。 例子:(省去了头文件) class man{private: int s;

protected: int a; public: int q; man();

man(int,int);//由两个man函数体现了重载 void show();};(他是不可省的) man::man() {s=1;a=1;q=0;} man::man(int i,int j) {s=i; a=j;} void man::show() {

cout<

void main()

{man D; cout<

class animal{public:void eat() {cout<<\ void sleep()

{cout<<\(Virtual) void breathe() {cout<<\

class fish:public animal {public:

void breathe()

{cout<<\

void fn(animal *pan) {pan->breathe();} //全局函数; void main()

{animal * pan; fish fh; pan=&fh; fn(pan);}

1.当无virtual(隐藏,在派生类里隐藏了与基类同名的函数)时,运行结果是:animal breathe

pan=&fh;虽然pan与fh是属于不同的类,但这样赋值是允许的,因为一个fish对象也是一个animal对象,(animal是基类,而fish是派生类),将fish类转换为animal类不用强制类型转换,C++编译器会自动进行这种类型转换。而把animal转换成fish,需要强制类型转换。(内存分析:当我们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的对象,然后才调用fish类的构造函数完成新增部分的构造,从而拼接出一个完整的fish对象。)

2.当有virtual是,结果是:fish bubble

原因分析:C++的多态性,在基类的函数前加上virtual关键字,在派生类中写该函数(即满足覆盖的条件),运行时将会根据对象的实际类型来调用相应的函数。