继承
杜Xinyu
明明可以靠脸吃饭,却非要靠才华
展开
-
c++多态(四)——抽象类
概念:抽象类也叫做接口类,在虚函数的后面写上=0;那么这个函数就变成了一个纯虚函数,包含纯虚函数的类叫做抽象类,其不能实例化出对象。继承了基类的派生类也不能实例化出对象,除非重写纯虚函数,只有重写了纯虚函数,派生类才能实例化对象。也就是说,纯虚函数规范了派生类必须重写虚函数,另外,纯虚函数更体现出了接口继承。class car{public: virtual void Drive() = 0;};class BMW :public car{public: virtual void Dr原创 2020-08-11 11:17:46 · 257 阅读 · 0 评论 -
c++多态(二)——虚函数以及虚函数的重写
虚函数:即被virtual修饰的类成员函数称为虚函数。class Person{public: virtual void BuyTicket() { cout << "全价票” << endl; }};虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类 型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。class Person{public: virtual void BuyTicket()原创 2020-07-31 15:47:42 · 5480 阅读 · 0 评论 -
c++多态(一)——多态的构成条件
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Child\Adult继承了Person。 Adult对象买票全价,Child对象买票半价。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写class Person{public: virtual void BuyTicket() {}};class Child :public Person{public: void BuyT原创 2020-07-10 11:48:09 · 485 阅读 · 0 评论 -
c++继承(九)——继承和组合
继承是is-a的关系,就是每一个派生类的对象都是一个基类对象class A{};class B :public A{};组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。class A{};class B{ public: A a;};继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用 术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。 继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的原创 2020-07-10 11:00:51 · 233 阅读 · 0 评论 -
c++继承(八)——虚拟菱形继承(详解)
上一篇我们提到菱形继承有数据冗余和二义性的问题。我们看下面的代码class fruit{public: string _name;};class apple :public fruit{protected: int _appleMoney;};class banana :public fruit{protected: int _bananaMoney;};class store :public apple, public banana{protected: str原创 2020-07-08 17:59:36 · 230 阅读 · 0 评论 -
c++继承(七)——单继承、多继承(菱形继承)
单继承:一个子类只有一个直接父类时称这个继承关系为单继class A{};class B : public A{};class C : public B{};多继承:一个子类有两个或以上直接父类时称这个继承关系为多继class apple{};class banana{};class fruit :public apple, public banana{};菱形继承:菱形继承是多继承的一种特殊情况。class Person{};class Student原创 2020-07-08 15:41:04 · 376 阅读 · 0 评论 -
c++继承(六)——继承与静态成员
基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一 个static成员实例 。在这里需要注意的有static修饰的成员,只能在类中进行声明,类外定义,至于为什么我们可以参考这一篇博客:为什么static数据成员一定要在类外初始化class Person{public: Person() { _count++; }private: string _name;public: static int _count;};int Pers原创 2020-07-03 15:45:31 · 973 阅读 · 3 评论 -
为什么static数据成员一定要在类外初始化?
因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。在《c++primer》里面说在类外定义和初始化是保证static成员变量只被定义一次的好方法。class A{private: static int num; //类内声明}; int A::num = 0; //类外定义初始化 不仅仅是static的成员不能在类内定义,const类的也不能在类内定义...原创 2020-07-03 15:06:28 · 1567 阅读 · 2 评论 -
c++继承(五)——基类与友元(了解)
友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员class Student;class Person{public: friend void fun(const Person& p, const Student& s);protected: int Ppro = 0;private: int Ppri = 1;};class Student :public Person{protected: int Spro = 0;private: int Sp原创 2020-07-03 13:57:45 · 722 阅读 · 0 评论 -
c++继承(四)——6个默认成员函数
在一个类中,至少有六个默认的成员函数,所谓的“默认”就是,我们不写,编译器自动给我们生成。class Person{public: Person(string name = "jason") :_name(name) { cout << "Person():" << endl; } Person(const Person& p) :_name(p._name) { cout << "Person(const Person&原创 2020-07-01 21:52:08 · 188 阅读 · 0 评论 -
c++继承(三)——继承的作用域
在继承的体系中,我们的派生类和基类都有自己独立的作用域。看代码:class A{public: int num = 1;};class B:public A{public: void fun() { cout << A::num << endl << num << endl; } int num = 2;};int main(){ B b; b.fun(); return 0;}这样写代码的编译是没有问题的,但原创 2020-06-30 16:57:48 · 224 阅读 · 0 评论 -
c++继承(一)——初识继承
继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。继承的定义class Base{public: int base;};class Derive:public Base{public: int derive;};Base就是基类,Derive是派生类cl原创 2020-06-24 10:16:57 · 251 阅读 · 1 评论