多态原理和多态实例

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

每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。虚函数表中列出了该类的虚函数地址。多出来的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;
}
时间: 2024-08-28 07:19:48

多态原理和多态实例的相关文章

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)最近进行数据库操作,遇到一个问题,就是大量删除一个数据表中的数据后,由于设定了id是自增的,导致再插入时,默认生成的id会很大,这个时候想要再次插入新的数据,应该怎么办呢?1.明确目前最后一个id的大小select id from tags order by id DESC limit 0,1; 假设返回的是9,则设置数据表从10开始自增 2.修改这个数据表从10开始自增alter table tags auto_increme

C++ 静态多态和动态多态 浅析

今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming)的语言. 这些能力和弹性使C++成为一个无可匹敌的工具,但也可能引发使用者的某些迷惑,比如多态.在这几种编程泛型中,面向对象编程.泛型编程以及很新的元编程形式都支持多态的概念,但又有所不同.

polymorphism-多态(函数多态、宏多态、静态多态、动态多态)

多态(polymorphism) 字面上意思--多种形态,即同一种方法的行为随上下文而异. 维基百科:Polymorphism (computer science), the ability incomputer programming to present the same interface for differing underlyingforms (data types). 1.函数多态(function polymorphism):也即是函数重载(functionoverloading

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

15:面向对象三大特性(封装、继承、多态)之多态

本小节知识点: [了解]什么是多态? [掌握]多态的条件 [了解]多态的优点 1.什么是多态? 什么是多态:多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->高级动物 女人 : 女人 -->人 -->高级动物 程序中的多态:父类指针指向子类对象 2.多态的条件 有继承关系 子类重写父类方法 父类指针指向子类对象 狗 *g = [狗 new]; 动物 *a = [狗 new]; 猫 *c = [猫 new]; 动物 *a

静态多态和动态多态

多态 多态就是多种形态,C++的多态分为静态多态和动态多态. 静态多态就是重载,因为是在编译期决议确定,所以称为静态多态. 动态多态就是通过继承重写基类的虚函数实现的多态,因为是在运行时决议确定,所以称为动态多态. class Base { public : virtual void func1() { cout<<"Base::func1" <<endl; } virtual void func2() { cout<<"Base::fun

编译期多态和运行时多态

前言 今日的C++不再是个单纯的"带类的C"语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分.在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态:在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态.在本文中,我们将了解: 1.什么是运行期多态   2.什么是编译期多态   3.它们的优缺点 运行期多态 运行期多态的设计

静态多态与动态多态

面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态. java中overload是静态多态,即根据参数列表进行最佳匹配,在编译阶段决定要具体执行哪个方法.而与之相反,overriden methods则是在run-time进行动态检查. 举例说明: public class UseAnimals { public void doStuff(Animal a) { System.out.println("Animal"); } public voi

c++多态原理

1 当类中声明虚函数时,编译器会在类中生成一个虚函数表 2 虚函数表是一个存储类成员函数指针的数据结构 3 虚函数表是由编译器自动生成与维护的 4 virtual成员函数会被编译器放入虚函数表中 5 当存在虚函数时,每个对象中都有一个指向虚函数表的指针(C++编译器给父类对象.子类对象提前布局vptr指针:当进行howToPrint(Parent *base)函数是,C++编译器不需要区分子类对象或者父类对象,只需要再base指针中,找vptr指针即可.) 6 VPTR一般作为类对象的第一个成员