中国建设银行官方网站app下载,个人网站毕业设计论文,wordpress login 出错,上海装修公司排名前20继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承?
继承是C语言面向对象的三大特性之一#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加… 继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承?
继承是C语言面向对象的三大特性之一是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加更多的不同的特性,从而衍生出来的另一个类的作用.
比如:我创造了一个人的类,成员有:姓名,性别
class Person
{
public:void Print(){cout _nameendl _sex endl _id endl;}private:string _name cris;string _sex 沃尔玛购物袋;string _id 123456;};现在,我要写的项目需要多种身份的人,比如:学生,老师,家长,但是这些身份的人物都有 人 这个类的特征,如果我们再去把每个人物的这些特征写一遍就太麻烦了,那么我们可以直接在 人 这个类上增加我们想要增加的东西 例如 :学生 的类可以继承 人 这个类
class Student : public Person
{
protected:int _stuid;
};老师 这个类也可以继承 人 这个类
class Teacher : public Person
{
protected:int _jobid;
};那现在,我们以学生为例来创建一个对象: Student s;进行调试: 我们可以看到,Student对象s不仅有自己的_stuid成员,还有父类Person的三个成员,这就是继承;
简单来说就是为了在创造多个对象,而这些对象有很多共同的类成员,那么就可以写一个类来把这些共同的类成员封装成为一个初始的类,其他的对象再基于这个初始的类来增加自己单独的特性,并且这个初始的类被称为父类/基类,而在他的基础上衍生出来的类被称为子类/派生类.
继承的写法
继承的写法十分简单.在实现子类的时候,在字类类名后面加上 ; 再加上继承方式和父类名即可 继承方式有三种: public protected private 例如:上面的Student类继承父类Person的时候就是以public方式继承
class Student : public Person三种继承方式实际上就是能够继承的成员不同 比如,上面的例子中Student类继承父类Person的方式是public,那么Student类就可以调用从父类那里继承下来的public成员:
int main()
{Student s;s.Print();
}Student对象明明自己没有写Print函数,但是却能够调用,这就是从父类那里继承下来的 注意点: 基类private成员在派生类中无论以什么方式继承都是不可见的,这里的不可见是指基类的私 有成员还是被继承到了派生类对象中但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它 基类private成员在派生类中是不能被访问如果基类成员不想在类外直接被访问**但需要在派生类中能访问就定义为protected。**可以看出保护成员限定符是因继承才出现的 在实际运用中一般使用都是public继承几乎很少使用protetced/private继承 使用关键字class时默认的继承方式是private使用struct时默认的继承方式是public不过 最好显示的写出继承方式
基类和派生类的赋值转换
在C的继承中,派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。就是把子类中父类的成员的那一部分赋值给一个父类对象 Student s;//子类成员可以赋值给父类对象/指针/引用Person p s;Person* p1 s;Person p2 s;但是父类成员不能直接赋值给子类成员
继承中的作用域
在继承体系中基类和派生类都有独立的作用域。子类和父类中有同名成员子类成员将屏蔽父类对同名成员的直接访问这种情况叫隐藏也叫重定义。在子类成员函数中可以使用 基类::基类成员 显示访问 例如:
class Person
{
public:void Print(){cout _nameendl _sex endl _id endl;}protected:string _name cris;string _sex 沃尔玛购物袋;string _id 123456;
};class Student : public Person
{
public:void Print(){cout _name endl _sex endl _id endl;//调用父类_id//cout _name endl _sex endl Person::_id endl;}protected:string _id 7890;
};int main()
{Student s;s.Print();return 0;
}此时的_id显示的是 s 的缺省值 需要注意的是如果是成员函数的隐藏只需要函数名相同就构成隐藏。 上面的例子中的Print函数就构成隐藏 虽然可以,但是在实际中在继承体系里面最好不要定义同名的成员。 友元关系不能继承也就是说基类友元不能访问子类私有和保护成员 在C11标准中,在类名后加关键字 final 之后,这个类就不能被继承
派生类的默认成员函数
一般情况下,实例化一个派生类时,构造函数和拷贝函数都是先调用父类的构造/拷贝构造再调用子类的构造/拷贝构造 , 但是父子类的析构函数构成隐藏关系,默认先调用子类析构,在调用父类析构 当然,子类在构造函数初始化的时候是需要显式调用父类去构造的; 例如:
class Person
{
public:Person(const char* name cris,const char* sex 沃尔玛购物袋 , const char* id 123456 ):_name(name), _sex(sex), _id(id){}void Print(){cout _nameendl _sex endl _id endl;}protected:string _name ;string _sex ;string _id ;
};class Student : public Person
{
public:Student(const char* id 7890):Person() // 这里需要调用父类名来进行父类的初始化 ,_id(id){}void Print(){cout _name endl _sex endl _id endl;//调用父类_id需要显示加上父类类名//cout _name endl _sex endl Person::_id endl;}protected:string _id;
};
单继承,多继承,虚拟继承
单继承;一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 多继承的一种特殊状态----菱形继承: 而菱形继承因为构造函数的原因 , 有数据冗余和二义性的问题。 例如:在Assistant的对象中,因为Student类和Teacher类都继承了Person类,因此Person成员会有两份。
而虚拟继承可以解决菱形继承的二义性和数据冗余的问题。 虚拟继承的用法:在需要被多种子类共同继承的父类前加上关键词 virtual 如上面的继承关系在Student和Teacher的继承Person时使用虚拟继承即可解决问题。 需要注意的是虚拟继承不要在其他地方去使用。
class Person
{
public :string _name ; // 姓名
};
class Student : virtual public Person
{
protected :int _num ; //学号
};
class Teacher : virtual public Person
{
protected :int _id ; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected :string _majorCourse ; // 主修课程
};
void Test ()
{Assistant a ;a._name peter;
}在使用虚拟继承后,Assistant类中的Person成员就只有一份了
但是一般情况下最好不要用菱形继承和虚拟继承
is-a 和 has-a
一般来讲,is-a指的是继承
class Person
{
public :string _name ; // 姓名
};
class Student : public Person
{
protected :int _num ; //学号
};即每个派生类对象都是一个基类对象,但是权限是public,派生类是可以改变基类所有的成员
继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言在继承方式中基类的内部细节对子类可见 。继承一定程度破坏了基类的封装基类的改变对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。
而has-a一般被称为组合,指的是一个类的成员包含了另外一个类:
class Person
{
public :void func(){}protected:string _name;
};class Student
{
protected :Person _name;
};在这种情况下,Student类可以调用Person类的共有成员,但不能使用保护成员,这是权限的缩小,但是会安全很多;
对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse)因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关系耦合度低。优先使用对象组合有助于你保持每个类被封装。
实际尽量多去用组合。组合的耦合度低代码维护性好。不过继承也有用武之地的有 些关系就适合继承那就用继承另外要实现多态也必须要继承。类之间的关系可以用 继承可以用组合就用组合。 文章转载自: http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn http://www.morning.kdlzz.cn.gov.cn.kdlzz.cn http://www.morning.jxcwn.cn.gov.cn.jxcwn.cn http://www.morning.dybth.cn.gov.cn.dybth.cn http://www.morning.rgxcd.cn.gov.cn.rgxcd.cn http://www.morning.cttti.com.gov.cn.cttti.com http://www.morning.rmryl.cn.gov.cn.rmryl.cn http://www.morning.qfkxj.cn.gov.cn.qfkxj.cn http://www.morning.c7624.cn.gov.cn.c7624.cn http://www.morning.mkbc.cn.gov.cn.mkbc.cn http://www.morning.fxzw.cn.gov.cn.fxzw.cn http://www.morning.qctsd.cn.gov.cn.qctsd.cn http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.clndl.cn.gov.cn.clndl.cn http://www.morning.tbkqs.cn.gov.cn.tbkqs.cn http://www.morning.lhytw.cn.gov.cn.lhytw.cn http://www.morning.ykrck.cn.gov.cn.ykrck.cn http://www.morning.sggzr.cn.gov.cn.sggzr.cn http://www.morning.ckhpg.cn.gov.cn.ckhpg.cn http://www.morning.cdlewan.com.gov.cn.cdlewan.com http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn http://www.morning.brhxd.cn.gov.cn.brhxd.cn http://www.morning.xcszl.cn.gov.cn.xcszl.cn http://www.morning.mzskr.cn.gov.cn.mzskr.cn http://www.morning.bmqls.cn.gov.cn.bmqls.cn http://www.morning.gccrn.cn.gov.cn.gccrn.cn http://www.morning.zlxkp.cn.gov.cn.zlxkp.cn http://www.morning.nkpls.cn.gov.cn.nkpls.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.drgmr.cn.gov.cn.drgmr.cn http://www.morning.jfbgn.cn.gov.cn.jfbgn.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn http://www.morning.tjqcfw.cn.gov.cn.tjqcfw.cn http://www.morning.fwcjy.cn.gov.cn.fwcjy.cn http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.dwncg.cn.gov.cn.dwncg.cn http://www.morning.mnwmj.cn.gov.cn.mnwmj.cn http://www.morning.hxpsp.cn.gov.cn.hxpsp.cn http://www.morning.pfnlc.cn.gov.cn.pfnlc.cn http://www.morning.lhxkl.cn.gov.cn.lhxkl.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.snnb.cn.gov.cn.snnb.cn http://www.morning.fydsr.cn.gov.cn.fydsr.cn http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn http://www.morning.wdpt.cn.gov.cn.wdpt.cn http://www.morning.zlxkp.cn.gov.cn.zlxkp.cn http://www.morning.mdlqf.cn.gov.cn.mdlqf.cn http://www.morning.skscy.cn.gov.cn.skscy.cn http://www.morning.pswzc.cn.gov.cn.pswzc.cn http://www.morning.cwkcq.cn.gov.cn.cwkcq.cn http://www.morning.bgpb.cn.gov.cn.bgpb.cn http://www.morning.hpcpp.cn.gov.cn.hpcpp.cn http://www.morning.btmwd.cn.gov.cn.btmwd.cn http://www.morning.yrnll.cn.gov.cn.yrnll.cn http://www.morning.drcnf.cn.gov.cn.drcnf.cn http://www.morning.bssjz.cn.gov.cn.bssjz.cn http://www.morning.fyglr.cn.gov.cn.fyglr.cn http://www.morning.ngkng.cn.gov.cn.ngkng.cn http://www.morning.mgmqf.cn.gov.cn.mgmqf.cn http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn http://www.morning.cpmwg.cn.gov.cn.cpmwg.cn http://www.morning.thpns.cn.gov.cn.thpns.cn http://www.morning.ryxgk.cn.gov.cn.ryxgk.cn http://www.morning.sjwzz.cn.gov.cn.sjwzz.cn http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.bbjw.cn.gov.cn.bbjw.cn http://www.morning.hwlmy.cn.gov.cn.hwlmy.cn http://www.morning.pudejun.com.gov.cn.pudejun.com http://www.morning.hcwjls.com.gov.cn.hcwjls.com http://www.morning.ggtgl.cn.gov.cn.ggtgl.cn http://www.morning.rfycj.cn.gov.cn.rfycj.cn http://www.morning.tnjff.cn.gov.cn.tnjff.cn http://www.morning.wmnpm.cn.gov.cn.wmnpm.cn http://www.morning.jbfjp.cn.gov.cn.jbfjp.cn http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn http://www.morning.wqrdx.cn.gov.cn.wqrdx.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.kjksn.cn.gov.cn.kjksn.cn