码迷,mamicode.com
首页 > 其他好文 > 详细

多态原理和多态实例

时间:2016-07-09 10:37:46      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

多态实现的关键------虚函数表

每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。虚函数表中列出了该类的虚函数地址。多出来的4个字节就是用来存放虚函数表的地址的。

 

多态的函数调用语句被编译成一系列根据基类指针所指向的(或基类引用所引用的)对象中存放的虚函数表的地址,在虚函数表中查找虚函数地址,并调用虚函数的指令。

多态在使用中会带来空间上额外的空间开销和时间开销。每个有虚函数类的对象中会多出4个字节来存放虚函数表的地址。

多态处理图形类的代码:

#include <iostream>
#include <math.h>
#include <string>
using namespace std;

class shape
{
public:
    virtual double area() = 0;//纯虚函数
    virtual void printInfo() = 0;
};

class circle :public shape
{
public:
    int r;
    virtual double area()
    {
        return (3.14*r*r);
    }
    virtual void printInfo()
    {
        cout << "circle" << area() << endl;
    }
};
class rectangle :public shape
{
public:
    int w, h;
    virtual double area()
    {
        return(w*h);
    }
    virtual void printInfo()
    {
        cout << "rectangle" << area() << endl;
    }
};
class triangle :public shape
{
public:
    int a, b, c;
    virtual double area()
    {
        double length = (a + b + c) / 2;
        return(sqrt((length - a)*(length - b)*(length - c)));
    }
    virtual void printInfo()
    {
        cout << "triangle" << area() << endl;
    }
};
int mycompare(const void *s1, const void *s2)
{
    shape **p1, **p2;
    p1 = (shape **)s1;
    p2 = (shape **)s2;
    if ((*p1)->area() > (*p2)->area())
        return 1;
    if ((*p1)->area() < (*p2)->area())
        return -1;
    else
        return 0;
}
int main()
{
    int n = 0; char s =  ;
    shape *c[50]; circle *pc = NULL; 
    rectangle *pr = NULL; triangle *pt = NULL;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> s;
        switch (s)
        {
        case c:
            pc = new circle();
            cin >> pc->r;
            c[i] = pc;
            break;
        case r:
            pr = new rectangle;
            cin >> pr->h >> pr->w;
            c[i] = pr;
            break;
        case t:
            pt = new triangle;
            cin >> pt->a >> pt->b >> pt->c;
            c[i] = pt;
            break;
        default:
            break;
        }
    }
    qsort(c, n, sizeof(shape*), mycompare);
    for (int i = 0; i < n; i++)
        c[i]->printInfo();
    return 0;
}

 

 

 

多态原理和多态实例

标签:

原文地址:http://www.cnblogs.com/helloforworld/p/5655285.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!