c++ primer学习笔记 之继承

发布时间:2014-10-22 19:55:03编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"c++ primer学习笔记 之继承",主要涉及到c++ primer学习笔记 之继承方面的内容,对于c++ primer学习笔记 之继承感兴趣的同学可以参考一下。

1.在C++中,所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类(例如“马”)称为“基类(base class )”或“父类(father class )”。新建的类(例如“公马”)称为“派生类(derived class )”或“子类(son class )”。 一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。通过继承,一个新建子类从已有的父类那里获得父类的特性。从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生。类的继承是用已有的类来建立专用类的编程技术。 派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整。一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对而言的。 以上介绍的是最简单的情况:一个派生类只从一个基类派生,这称为单继承(single inheritance),这种继承关系所形成的层次是一个树形结构。一个派生类不仅可以从一个基类派生,也可以从多个基类派生。一个派生类有两个或多个基类的称为多重继承(multiple inheritance)。关于基类和派生类的关系,可以表述为:派生类是基类的具体化,而基类则是派生类的抽象。 2.派生类 C++使用类派生列表指定基类,类派生列表可以指定多个基类,访问标号决定了对继承成员的访问权限。如果想要继承基类的接口,则应该进行public派生.  在派生类中,对基类的继承方式可以有public(公用的),private (私有的)和protected(保护的)3种。不同的继承方式决定了基类成员在派生类中的访问属性。简单地说: 公用继承(public inheritance) 基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。私有继承(private inheritance) 基类的公用成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有。受保护的继承(protected inheritance)基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。保护成员的意思是: 不能被外界引用,但可以被派生类的成员引用,            //例11.1 访问公有基类的成员。下面写出类的声明部分: Class Student//声明基类 { public : //基类公用成员 void get_value( ) { cin>>num>>name>>sex; } void display( ) { cout<<″ num: ″<<num<<endl; cout<<″ name: ″<<name<<endl; cout<<″ sex: ″<<sex<<endl; } private : //基类私有成员 int num; string name; char sex; }; class Student1: public Student //以public方式声明派生类Student1 { public: void display_1( ) { cout<<″ num: ″<<num<<endl; //企图引用基类的私有成员,错误 cout<<″ name: ″<<name<<endl; //企图引用基类的私有成员,错误 cout<<″ sex: ″<<sex<<endl; //企图引用基类的私有成员,错误 cout<<″ age: ″<<age<<endl; //引用派生类的私有成员,正确 cout<<″ address: ″<<addr<<endl; } //引用派生类的私有成员,正确 private: int age; string addr; }; /*由于基类的私有成员对派生类来说是不可访问的,因此在派生类中的display_1函数中直接引用基类的私有数据成员num,name和sex是不允许的。只能通过基类的公用成员函数来引用基类的私有数据成员。可以将派生类Student1的声明改为 class Student1: public Student//以public方式声明派生类Student1*/ { public: void display_1( ) {cout<<″ age: ″<<age<<endl; //引用派生类的私有成员,正确cout<<″ address: ″<<addr<<endl; //引用派生类的私有成员,正确} private: int age; string addr; }; /*然后在main函数中分别调用基类的display函数和派生类中的display_1函数,先后输出5个数据。 可以这样写main函数(假设对象stud中已有数据):*/ int main( ) { Student1 stud;//定义派生类Student1的对象stud ┆ stud.display( );//调用基类的公用成员函数,输出基类中3个数据成员的值stud.display_1();//调用派生类公用成员函数,输出派生类中两个数据成员的值 return 0; } 派生类一般会重定义所继承的虚函数,派生类型必须对想要重定义的每个继承成员进行声明,派生类中的虚函数声明必须与基类中的定义方式完全匹配,但有一个例外,返回对基类型的引用(或指针)的虚函数。 派生类对象包含基类对象作为子对象 派生类中的函数可以使用基类的成员 用作基类的类必须是已经定义的 3.派生类到基类的转换 1.将派生类型的对象传给希望接收基类引用的函数。 看起来是在传递对象,实际上实参是对该对象的引用,对象本身并未复制。并且转换不会在任何方面改变派生类对象,该对象仍是派生类对象。 2.将派生类型的对象传给希望接受基类对象(并非引用)的函数时,情况完全不同,在这种情况下,形参的类型是固定的----在编译和运行时都是基类对象。如果派生类型对象调用这样的函数,则该派生对象的基类部分被复制到形参。 基类类型的引用或指针可以引用基类类型对象,也可以引用派生类型对象。无论实际对象具有哪种类型,编译器都将它当做基类类型对象。 4.运行时确定virtual函数的调用 通过引用或指针调用虚函数时,编译器将生成代码,在运行时确定调用哪个函数,被调用的函数是与动态类型相对应的函数 通过基类引用或指针调用基类定义的函数时,我们并不知道执行函数的对象的确切类型,执行函数的对象可能是基类类型的,也可能是派生类型的。如果调用虚函数,则直到运行时才能确定调用哪个函数,运行的虚函数时引用所绑定的或指针所指向的对象所属类型定义的版本。 5.覆盖虚函数机制: Item_base *baseP = &derived; double d = baseP->Item_base::net_price(42); 这段代码强制将net_price调用确定为Item_base中定义的版本,该调用将在编译时确定。通常用于派生类虚函数调用基类的版本


上一篇:uva 572 - Oil Deposits
下一篇:cocos2D-x:触摸(4)

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款