C++继承中的指针问题

转载自潘志威的博客

继承中的指针问题

指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承而来的那些成员,不能访问子类特有的元素,除非应用强类型转换。
例如有基类B和从B派生的子类D,则B *p; D dd; p=ⅆ是可以的,指针p只能访问从基类派生而来的成员,不能访问派生类D特有的成员.因为基类不知道派生类中的这些成员。

不能使派生类指针指向基类对象!

如果派生类中覆盖了基类中的成员变量或函数,则当声明一个基类指针指向派生类对象时,这个基类指针只能访问基类中的成员变量或函数。
例如:基类B和派生类D都定义了函数f,则B *p; D m; p=&m; m.f()将调用基类中的函数f()而不会调用派生类中的函数f()。

如果基类指针指向派生类对象,则当对其进行增减运算时,它将指向它所认为的基类的下一个对象,而不会指向派生类的下一个对象,因此,应该认为对这种指针进行的增减操作是无效的。

虚函数的继承问题

为什么要使用虚函数:当声明一个基类指针指向派生类对象时,这个基类指针只能访问基类中的成员函数,不能访问派生类中 特有的成员变量或函数 。如果使用虚函数就能使这个指向派生类对象的基类指针访问派生类中的成员函数,而不是基类中的成员函数,基于这一点派生类中的这个成员函数就必须和基类中的虚函数的形式完全相同,不然基类指针就找不到派生类中的这个成员函数。
使用虚函数就实现了一个接口多种方法

如果基类含有虚函数则当声明了一个基类的指针时,当基类指针指向不同的派生类时,它就会调用相应派生类中定义的虚函数版本.这种调用方法是在运行时决定的 ,例如在类B中声明了虚函数,C、D、E都从B继承而来,且都实现了自已的虚函数版本,那么当定义了一个B类的指针P时,当P指向子类C时就会调用子类C中定义的虚函数,当P指向子类D时就会调用子类D中定义的虚函数,当P指向子类E时就会调用子类E中定义的虚函数。

虚函数与重载的区别:在子类中重定义虚函数时,虚函数必须有与基类虚函数的声明完全相同的参数类型和数量,这和重载是不同的。如果不相同,则是函数重载,就失去了虚函数的本质。

析构函数可以是虚函数,但构造函数不能。

纯虚函数声明形式为virtual 类型 函数名(参数列表)=0;注意后面的等于0。如果类至少有一个纯虚函数,则这个类就是抽象的。

抽象类不能有对象,抽象类只能用作其它类的基类,因为抽象类中的一个或多个函数没有定义,所以不能用抽象类声明对象。但仍然可以用抽象类声明一个指针,这个指针指向派生类对象。

如果派生类中未定义虚函数 ,则会使用基类中定义的函数。