剖析多态

 从公布的文档里面看了2篇关于多态的文章,觉得没有给那些初学者讲的十分清楚;今天希望自己能为那些一心想学C++的小弟小妹奉上绵薄之力,增深他们一点C++根基!并不是说我写的比别人好,我也是阐述自己从书上得来的东西,一方面也是考验自我,看看自己能不能讲清楚;好了,废话不说了; 多态得以实现的关键在于虚函数,那么类A的定义中多一个虚函数时,我们应该知道哪件事情呢?

我们应该知道以下几点:
         cout<<sizeof(A)<<endl;       的结果会是多少呢   会比正常的没有虚函数的类占用的空间多出4个字节,因为每一个含有虚函数的类都要维护一张虚函数表(V-Table),而在类中操纵此表的就是占用那余外4个字节的名为V-PTR的指针变量;虚函数表里面都是属于此类的虚函数入口地址,用V-PTR指针的迁移完成不同函数的调用;而且子类与基类的虚函数表中的同名函数在表中的位置也是一样的!这一点很重要,只有这样才能正确完成多态;比如说基类与子类都有一个Fly()虚函数,如果它的入口地址存放于基类的V-Table表最上面,那么子类的Fly()虚函数的入口地址也会存放于子类的V-Table表最上面; 我一直在强调这一点很重要,因为这就是多态完成的关键所在,若虚函数入口地址在表中的位置不一样,多态是不可能被实现的;当然,这一点程序员是没有必要担心的,编译器已经为你做好了准备;

         有虚函数的类的析构函数也是虚的;这是为什么呢,如果我们从多态的使用情况出发,这点很容易解释!多态都是基类指针指向子类对象;但是当你良好的使用了多态性质之后,析构工作就变得很重要!这时如果你的析构函数是虚函数,那么它的入口地址同样被放入相应类的V-Table里面,这样不用用户指定,它自己就会析构很多曾经创造的对象!篇幅有限,我没有用实例或者图片来辅助大家加深理解!望谅解!不过,这些东西如果自己不自己看书,光看一篇文章是不能了解的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多态是面向对象编程中的一种重要概念,它允许不同的对象对同一消息作出不同的响应。在Java中,多态由两种实现方式:继承和接口。 我们来看一个需求分析的实例,假设有一个图形类,它有一个计算面积的方法,而具体的图形类如圆形、矩形、三角形等都是该图形类的子类。我们需要实现一个计算图形面积的程序。 首先,我们需要定义一个图形类,并在该类中声明一个计算面积的方法: ```java public class Shape { public double getArea() { return 0; } } ``` 接着,我们定义圆形、矩形、三角形等图形类,并分别重写父类的计算面积方法: ```java public class Circle extends Shape { private double radius; public Circle(double r) { radius = r; } @Override public double getArea() { return Math.PI * radius * radius; } } public class Rectangle extends Shape { private double length; private double width; public Rectangle(double l, double w) { length = l; width = w; } @Override public double getArea() { return length * width; } } public class Triangle extends Shape { private double base; private double height; public Triangle(double b, double h) { base = b; height = h; } @Override public double getArea() { return 0.5 * base * height; } } ``` 现在,我们可以在主程序中创建各种图形对象,并调用它们的计算面积方法: ```java public static void main(String[] args) { Shape circle = new Circle(5); Shape rectangle = new Rectangle(3, 4); Shape triangle = new Triangle(6, 8); System.out.println("Circle area: " + circle.getArea()); System.out.println("Rectangle area: " + rectangle.getArea()); System.out.println("Triangle area: " + triangle.getArea()); } ``` 这里我们创建了一个圆形对象、一个矩形对象和一个三角形对象,并分别调用它们的getArea()方法计算面积。由于这三个对象都是Shape类的子类,因此在调用getArea()方法时会根据具体的对象类型执行相应的方法,这就是多态的体现。 总结一下,多态是Java面向对象编程中的一个重要概念,它允许不同的对象对同一消息作出不同的响应。在实现多态时,可以采用继承和接口两种方式。以上例子展示了继承方式实现多态的示例,我们定义了一个图形类和各种具体的图形类,并重写了父类的计算面积方法,然后在主程序中创建各种图形对象,并分别调用它们的计算面积方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值