c++多态原理

1 当类中声明虚函数时,编译器会在类中生成一个虚函数表

2 虚函数表是一个存储类成员函数指针的数据结构

3 虚函数表是由编译器自动生成与维护的

4 virtual成员函数会被编译器放入虚函数表中

5 当存在虚函数时,每个对象中都有一个指向虚函数表的指针(C++编译器给父类对象、子类对象提前布局vptr指针;当进行howToPrint(Parent *base)函数是,C++编译器不需要区分子类对象或者父类对象,只需要再base指针中,找vptr指针即可。)

6 VPTR一般作为类对象的第一个成员

C++中多态的实现原理

当类中声明虚函数时,编译器会在类中生成一个虚函数表

虚函数表是一个存储类成员函数指针的数据结构

虚函数表是由编译器自动生成与维护的

virtual成员函数会被编译器放入虚函数表中

存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)

1 通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多。

2 出于效率考虑,没有必要将所有成员函数都声明为虚函数。

3 C++编译器,执行HowToPrint函数,不需要区分是子类对象还是父类对象。

证明vptr指针的存在

#include <iostream>
using namespace std;

class A
{
public:
    void printf()
    {
        cout<<"aaa"<<endl;
    }
protected:
private:
    int a;
};

class B
{
public:
    virtual void printf()
    {
        cout<<"aaa"<<endl;
    }
protected:
private:
    int a;
};

void main()
{
    //加上virtual关键字 c++编译器会增加一个指向虚函数表的指针 。。。
    printf("sizeof(a):%d, sizeof(b):%d \n", sizeof(A), sizeof(B));
    cout<<"hello..."<<endl;
    system("pause");
    return ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 01:30:11

c++多态原理的相关文章

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++编译器角度理解多态的实现原理

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

多态原理探究

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

多态原理和多态实例

多态实现的关键------虚函数表 每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针.虚函数表中列出了该类的虚函数地址.多出来的4个字节就是用来存放虚函数表的地址的. 多态的函数调用语句被编译成一系列根据基类指针所指向的(或基类引用所引用的)对象中存放的虚函数表的地址,在虚函数表中查找虚函数地址,并调用虚函数的指令. 多态在使用中会带来空间上额外的空间开销和时间开销.每个有虚函数类的对象中会多出4个字节来存放虚函数表的地址. 多态处理图形类的代码

深入理解JAVA多态原理

之前一直知道多态是什么东西,平时敲代码也经常用到多态,但一直没有真正了解多态底层的运行机制到底是怎么样的,这两天才研究明白点,特地写下来,跟各位同学一起进步,同时也希望各位大神指导和指正. 多态的概念:同一操作作用于不同对象,可以有不同的解释,有不同的执行结果,这就是多态,简单来说就是:父类的引用指向子类对象.下面先看一段代码 1 package polymorphism; 2 3 class Dance { 4 public void play(){ 5 System.out.println(

三分钟理解Java继承和多态原理

现上一道面试题 public class MainClass { public static void main(String[] args) { Fu f = new Zi(); Zi z = new Zi(); System.out.println("f.num:"+f.num); System.out.println("z.num:"+z.num); System.out.println("f.num:"+f.num2); System.o

【C/C++学院】(10)重载与重写/多态的深入/多继承接口

1. 重写 PK 重载理解 1.1 函数重载 必须在同一个类中进行 子类无法重载父类的函数,父类同名函数将被名称覆盖 重载是在编译期间根据参数类型和个数决定函数调用 1.2 函数重写 必须发生于父类与子类之间 并且父类与子类中的函数必须有完全相同的原型 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 多态是在运行期间根据具体对象的类型决定函数调用 #include <cstdlib> #include <iostream> using namespa

C++多态面试题

面试题1:请谈谈你对多态的理解 多态的实现效果 当用父类对象指向子类对象的时候,函数在子类来回穿梭表现不同的形态. 多态:同样的调用语句有多种不同的表现形态: 多态实现的三个条件 有继承.有virtual重写.有父类指针(引用)指向子类对象. 多态的C++实现 virtual关键字,告诉编译器这个函数要支持多态:不是根据指针类型判断如何调用:而是要根据指针所指向的实际对象类型来判断如何调用 多态的理论基础 动态联编PK静态联编.根据实际的对象类型来判断重写函数的调用. 动态联编,在运行的时候才确

我对多态的的理解以及重载和重写

同一种语句有多重形态,在不同的类型中,有不同的属性和表现方法: 多态原理:多态的是函授指针 多态的实现效果 多态:同样的调用语句有多种不同的表现形态: 多态实现的三个条件  有继承.有virtual重写.有父类指针(引用)指向子类对象. 多态的C++实现 virtual关键字,告诉编译器这个函数要支持多态:不要根据指针类型判断如何调用:而是要根据指针所指向的实际对象类型来判断如何调用 多态的理论基础  动态联编PK静态联编.根据实际的对象类型来判断重写函数的调用. 多态的重要意义  设计模式的基