三种类继承方式的不同
1.公有继承:
基类 | 派生类 |
公有成员 | 公有成员 |
保护成员 | 保护成员 |
私有成员 | 不可访问 |
2.私有继承:
基类 | 派生类 |
公有成员 | 私有成员 |
保护成员 | 私有成员 |
私有成员 | 不可访问 |
3.保护继承:
基类 | 派生类 |
公有成员 | 保护成员 |
保护成员 | 保护成员 |
私有成员 | 不可访问 |
私有继承和保护继承的不同在于连续继承时私有继承两次后成员不可访问,但保护继承根据连续继承方式不同访问权限不同;
继承小实例:
问题1:
定义一个document类,有数据成员name,派生出book类,增加数据成员pageCount。
代码
#include<bits/stdc++.h> using namespace std; class Document{//基类 public: string name; Document(){}//默认无参构造函数 Document(string name) { this->name=name; }//带参构造函数 void Showname(){ cout<<name<<endl; }//输出文件名称 }; class Book : public Document{//派生类Book 公有继承 Document public: Book(){}//默认构造函数 Book(int pageCount,string name) : Document(name) { this->pageCount=pageCount; }//带参构造函数 void Showinformation() { cout<<pageCount<<endl; Showname(); }//输出信息 private: int pageCount; }; int main() { Book a(1212,"AAA"); a.Showinformation(); return 0; }
问题2
定义一个哺乳动物类Mammal,再由此派生出狗类Dog,定义一个Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序;
构造函数的调用顺序是先基类后派生类,析构函数的调用顺序是先派生类与基类,与构造函数顺序相反。
代码
#include<bits/stdc++.h> using namespace std; class Mammal{ public: int age; Mammal(int age=0) { this->age=age; cout<<"setMammal"<<endl; } ~Mammal() { cout<<"delMammal"<<endl; } }; class Dog : public Mammal { public: string colour; Dog(int age,string colour) : Mammal(age) { this->colour=colour; cout<<"setdog"<<endl; } ~Dog() { cout<<"deldog"<<endl; } }; int main() { Dog A(6,"red"); }
反思与总结:
1.初学尽量用公有继承,比较方便
2.每一个类的默认构造函数与带参构造函数都要有,要给全
3.带参构造函数不要给初始值,不然会报错,原因暂时不明,等知道了再来补上。
4.派生类的带参构造函数要调用基类的带参构造函数给基类赋值,写在派生类的参数表里,有多个用逗号间隔,不写在大括号里