在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;
}