C++多态继承解析

来源:互联网 发布:金山软件待遇怎么样 编辑:程序博客网 时间:2024/05/08 11:48

在C++中,类的概念是最重要的,类就是实物的一个模版,或是一种抽象的方法和数据的封装,每用类声明一个变量,那我们就叫做类的实例化,在类的生存区域,会调用构造函数,在临界区则会调用析构函数,构造的对象在内存中的表示就是类中的数据成员依次构造,如class string{char *p;int size};在内存中这个string类共有8字节,那么继承又是如何呢,,当继承了这个类后,在新增一个int类型,则class mystring:public string{int log};sizeof(mystring)的大小有12个字节,因为要算在基类的两个数据成员,那么我们为什么要说继承呢?

因为一个个单独的类固然好用,但是要想尽可能的复用代码,最好的方法事实上就是继承,继承后,我们就可以使用父类的public和protected的函数和数据成员,使用继承的程序设计就是面向对象程序设计,如stack类继承llist类就是一个很好的方法,那么继承的作用是如此大可以复用代码,现在就可以到此结束了吗?

class Employee {protected:void ability(){};};class C_programmer:public Employee{public:void ability(){Employee::ability();};};class CPP_programmer:public C_programmer{public:void ability();};class advanced_manager:public CPP_programmer{public:void ability();};

在上面的类体系中,我们层层继承,每一个更高级别的都会复用低级别的函数,因为在职场人员要懂得基本的礼仪,而后c程序员以及更高的职位需要更多的知识那么我们想象一下,这些同学们来到菜市场买菜,而我们则是要测量他们的这也技能,那该怎么办呢,事先我们并不知道他们是做什么的,那又如何来测量呢,我们可以根据基类的指针可以指向派生类的地址来做(因为派生类同时也是一个基类对象,虽然复杂了一些),如Employee *p=new CPP_programmer;p->ability();,呵呵这样做看起来很好,可事实上却只能测量出employee的技能,这是为什么呢,我们不是指向了CPP_programmer的事例了吗?

因为虽然指向了派生类也就是CPP_programmer的地址,但是基类并不知道派生类的内容,基类指针只知道sizeof(基类自己)的内容,它无法知道sizeof(派生类)的内容,这时我们必须在基类的内容中添加一个指针保留派生类的内容,这就是virtual的作用了。

虚函数是一种可以让派生类重载基类函数的机制,即通过一个在类内部创建一个指针指向一张表来维护函数指针,那么当我们写下Employee *p=new CPP_programmer时,因为在CPP_programmer的内部创建了一个指针,而指针是指向一个构造了虚函数的表,而这个表是指向CPP_programmer的函数,所以它可以正确的调用,即调用实体的类类型而不是基类指针。

因此,我们可以这样写,

class Employee {protected:virtual void ability(){};};class C_programmer:public Employee{public:virtual void ability(){Employee::ability();};};class CPP_programmer:public C_programmer{public:virtual void ability(){};};class advanced_manager:public CPP_programmer{public:virtual void ability(){};};int main(){Employee *employee[5];employee[0]=new Employee;employee[1]=new C_programmer;employee[2]=new CPP_programmer;employee[3]=new advanced_manager;employee[4]=new CPP_programmer;for(int i=0;i<5;++i)employee[i]->ability;return 0;}


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击