大家好,欢迎来到IT知识分享网。
一.类继承
1.概念
用已有的类来建立专用类的编程技术;
2.目的
实现代码重用
3.父类/基类 和 子类/派生类
父类:已有的类叫父类,是抽象类
子类:由基类派生出来的类叫派生类/子类,是父类的具体化
派生类的构造函数一般有3项工作要完成:首先 基类初始化 ,其次 成员对象初始化,最后 执行派生类构造函数体
4.语法形式
class 子类名 : 权限限定符 基类名1, 权限限定符 基类名2….
{
//class body
};
eg1:public继承
//public继承 class Base{ public: Base(int val = 0) : val(val) { cout << __func__ << ":" << __LINE__ << endl; } ~Base() { cout << __func__ << ":"<<__LINE__ << endl; } int getval() const; protected: void setval(int); private: int val; }; void Base::setval(int val) { this->val = val; } int Base::getval() const { return this->val; } //子类:public继承 //基类的public成员 -> 子类的public成员 //基类的protected成员 -> 子类的protected成员 //基类的private成员只能通过基类的接口访问 class Inherit : public Base{ public: Inherit(int val=0); ~Inherit(); public: void setmyval(int); int getmyval() const; private: int myval; }; Inherit::Inherit(int val) : myval(val) { cout << __func__ << ":" << __LINE__ << endl; } Inherit::~Inherit() { cout << __func__ << ":" << __LINE__ << endl; } void Inherit::setmyval(int v) { setval(v);//基类的protected成员在子类的访问权限是protected //val++;//基类的private成员只能通过基类接口访问 this->myval = v; } int Inherit::getmyval() const { return this->myval; } int main() { Inherit obj; cout << sizeof obj << endl; //obj.setval(666);//protected成员只能在类内部或子类内部访问 obj.setmyval(888); cout << obj.getval() << endl; return 0; }
eg2:protected继承
class Base{ public: Base(int val = 0) : val(val) { cout << __func__ << ":" << __LINE__ << endl; } ~Base() { cout << __func__ << ":"<<__LINE__ << endl; } int getval() const; protected: void setval(int); private: int val; }; void Base::setval(int val) { this->val = val; } int Base::getval() const { return this->val; } //子类:protected继承 //基类的public成员 -> 子类的protected成员 //基类的protected成员 -> 子类的protected成员 //基类的private成员只能通过基类的接口访问 class Inherit : protected Base{ public: Inherit(int val=0); ~Inherit(); public: void setmyval(int); int getmyval() const; private: int myval; }; Inherit::Inherit(int val) : myval(val) { cout << __func__ << ":" << __LINE__ << endl; } Inherit::~Inherit() { cout << __func__ << ":" << __LINE__ << endl; } void Inherit::setmyval(int v) { setval(v);//基类的protected成员在子类的访问权限是protected cout << getval() << endl; //val++;//基类的private成员只能通过基类接口访问 this->myval = v; } int Inherit::getmyval() const { return this->myval; } int main() { Inherit obj; cout << sizeof obj << endl; //obj.setval(666);//protected成员只能在类内部或子类内部访问 obj.setmyval(888); //cout << obj.getval() << endl;//protected继承:基类的public在子类的访问权限? return 0; }
eg3:private继承
class Base{ public: Base(int val = 0) : val(val) { cout << __func__ << ":" << __LINE__ << endl; } ~Base() { cout << __func__ << ":"<<__LINE__ << endl; } int getval() const; protected: void setval(int); private: int val; }; void Base::setval(int val) { this->val = val; } int Base::getval() const { return this->val; } //子类:private继承 //基类的public成员 -> 子类的private成员 //基类的protected成员 -> 子类的private成员 //基类的private成员只能通过基类的接口访问 class Inherit : private Base{ public: Inherit(int val=0); ~Inherit(); public: void setmyval(int); int getmyval() const; private: int myval; }; Inherit::Inherit(int val) : myval(val) { cout << __func__ << ":" << __LINE__ << endl; } Inherit::~Inherit() { cout << __func__ << ":" << __LINE__ << endl; } void Inherit::setmyval(int v) { setval(v);//基类的protected成员在子类的访问权限是protected cout << getval() << endl; //val++;//基类的private成员只能通过基类接口访问 this->myval = v; } int Inherit::getmyval() const { return this->myval; } int main() { Inherit obj; cout << sizeof obj << endl; //obj.setval(666);//protected成员只能在类内部或子类内部访问 obj.setmyval(888); //cout << obj.getval() << endl;//protected继承:基类的public在子类的访问权限? return 0; }
总结:
1)public继承
基类的public成员 -> 子类的public成员
基类的protected成员 -> 子类的protected成员
基类的private成员只能通过基类的接口访问
2)protected继承
基类的public成员 -> 子类的protected成员
基类的protected成员 -> 子类的protected成员
基类的private成员只能通过基类的接口访问
3)private继承
基类的public成员 -> 子类的private成员
基类的protected成员 -> 子类的private成员
基类的private成员只能通过基类的接口访问
二.子类构造函数和析构函数
1.注意
构造函数和析构不能够被继承;
每个类都有自己的构造和析构
2.顺序
先构造基类对象,再构造子类对象
先析构子类对象,再析构基类对象
三.is-a关系
描述继承关系,即派生类一定是基类的一种
例:水果有香蕉,水果类和香蕉类之间就是is-a关系
四.has-a关系
用来描述组合关系
例如:午餐有水果,午餐类和水果类之间的关系就是has-a关系
五.多重继承
1.语法形式
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
eg:
class Man{ public: Man() { cout << __func__ << ":" << __LINE__ << endl; } ~Man() { cout << __func__ << ":" << __LINE__ << endl; } public: void prnmsg() { cout << __func__ << ":" << __LINE__ << endl; } }; class Wolf{ public: Wolf() { cout << __func__ << ":" << __LINE__ << endl; } ~Wolf() { cout << __func__ << ":" << __LINE__ << endl; } }; //多重继承 class WolfMan : public Man, public Wolf{ public: WolfMan() { cout << __func__ << ":" << __LINE__ << endl; } ~WolfMan() { cout << __func__ << ":" << __LINE__ << endl; } }; int main() { WolfMan obj; return 0; }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/116637.html