- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C基础学习之继承
一.继承的概念 1.继承的定义 简单地说: 如果A是基类,B是A的派生类,那么B将继承A的数据和函数。 例如: class A { public: void Func1(void); void Func2(void); }; 2.类的访问控制 Protected成员: 有时作为基类的类具有一些成员,它希望允许派生类访问但禁止其他用户访问这些成员。对于这样的成员应使用受保护的访问标号(Protected), protected成员可以被派生类对象访问但不能被该类型的普通用户访问。 例如: class A { public: void Func1(void); private: void Func2(void); protected: void Func3(void); }; class B : public A { public: void Func4(void);/ }; class B : Func4(void); { Func1(); Func2(); // 错误 ,不可以调用父类private成员 Func3(); //可以调用父类protected:成员 }; main() { B b; b.Func1(); // B从A继承了函数Func1 b.Func2(); // 错误,类的用户不可调用private成员 b.Func3(); // 错误,类的用户不可调用protected成员 b.Func4(); } 3.继承下的构造函数与析构函数 规则: 构造派生类对象时首先执行基类构造函数初始化对象的基类部分。 析构则恰好相反,先析构派生类再析构基类。 4.继承与静态成员 Notes1:如果类定义了static成员,则整个继承层次只有一个这样的成员 。 无论从基类派生出多少个派生类,每个static成员只有一个实例。 Notes2: Static成员遵循常规访问控制:如果成员在基类中为private,则派生类不能访问它。 假定可以访问成员,则即可以通过基类访问static成员,也可以通过派生类访问static成员。一般而言,既可以使用作用域操作符访问。 二.多态性 5.动态多态 众所周知的的多态 . 6.虚函数的限制 静态函数不能是虚函数 内联函数不能是虚函数 构造函数不能是虚函数 析构函数可以是虚函数,而且通常为虚函数 三.纯虚函数与抽象类 1.定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0” virtual void funtion1()=0 引入原因: 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。 3.抽象类 包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。 例如: class A? {public:?A();?void f1();?virtual void f2();?virtual void f3()=0;?virtual ~A(); }; class B : public A? {public:?B();?void f1();?void f2();?void f3();?virtual ~B(); }; f1()是一个普通的重载.调用m_j-f1();会去调用A类中的f1(),它是在我们写好代码的时候就会定好的.也就是根据它是由A类定义的,这样就调用这个类的函数.f2()是虚函数.调用m_j-f2();会调用m_j中到底保存的对象中,对应的这个函数.这是由于new的B对象.f3()与f2()一样,只是在基类中不需要写函数现实. class B : public A? {public:?B();?void f1();?void f2();?void f3();?virtual ~B(); }; f1()是一个普通的重载.调用m_j-f1();会去调用A类中的f1(),它是在我们写好代码的时候就会定好的.也就是根据它是由A类定义的,这样就调用这个类的函数.f2()是虚函数.调用m_j-f2();会调用m_j中到底保
文档评论(0)