vptr

#include <stdio.h>
class Point3d
{
public:
    virtual ~Point3d(){}
public:
    static Point3d origin;
    float x, y, z;
};

//从打印的地址看出这个类的结构应该是vptr|x|y|z,vptr是放类空间的头部的
int main()
{
    printf("Point3d::x%p\n", &Point3d::x) ;//这个是求x在类中的偏移量
    //printf("Point3d::y%p\n", &Point3d::y) ;
    printf("Point3d::z--%p\n", &Point3d::z) ;
    //printf("Point3d::origin%p\n", &Point3d::origin) ;
    Point3d d;
    printf("Point3d--%p\n", &d);//求具体的地址
    printf("Point3d::z--%p\n", &d.z);//求具体的地址
    getchar();
    return 0;
}
时间: 2024-09-28 06:15:25

vptr的相关文章

C++ virtual table pointer - vptr

To implement virtual functions, C++ uses a special form of late binding known as the virtual table. The virtual table is a lookup table of functions used to resolve function calls in a dynamic/late binding manner. The virtual table sometimes goes by

vptr, vtable, virtual base class table

#include <iostream> using namespace std; class X { int x, y, z; }; class Y: public virtual X { }; class Z: public virtual X { virtual void f() { } }; class A: public Y, public Z { }; int main() { A *p; cout << "pointer:" << siz

深入剖析C++多态、VPTR指针、虚函数表

在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 1.类型兼容性原则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员.这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决.类型兼容规则中所指的替代包括以下情况: 子类对象可以当作父类对象使用 子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对

虚函数表指针vptr的测试

类的虚函数调用是通过虚函数表实现的.所谓虚函数表,是编译器自动为一个带有虚函数的类生成的一块内存空间,其中存储着每一个虚函数的入口地址.由于函数的入口地址可以看成一个指针类型,因此这些虚函数的地址间隔为四个字节.而每一个带有虚函数类的实例,编译器都会为其生成一个虚函数指针——vptr,在类的对象初始化完毕后,它将指向虚函数表. 这个vptr指针将位于类对象的首部,即作为第一个成员变量,处于类对象代表的内存块的前四个字节中.为了便于理解和复习,在此将其内存结构以图示之. 查阅资料得知,C++标准并

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据

53)vptr指针的分布初始化

1)一个父类: 2)一个子类: 3)我的main函数内容 4)通过结果证明 那么产生了问题,这个print是一个虚函数,不应该  在  我的main函数中   通过调用pp->print,在print函数里面的那个print应该是 子类的啊,为啥是父类的? 1)首先在我运行这个代码: 1 public: 2 Child(int a,int b):Parent(a) 3 { 先执行  父类的 构造函数   也就是那个vptr存的是父类中虚函数表的地址 然后再执行 1 cout<<"

对象模型(Object-Model):关于vptr、vtbl

当一个类本身定义了虚函数,或其父类有虚函数时,为了支持多态机制,编译器将为该类添加一个虚函数指针(vptr).虚函数指针一般都放在对象内存布局的第一个位置上,这是为了保证在多层继承或多重继承的情况下能以最高效率取到虚函数表.当vprt位于对象内存最前面时,对象的地址即为虚函数指针地址. 发生动态绑定时,编译器根据虚指针找到相应的虚函数来执行: 原文地址:https://www.cnblogs.com/vlyf/p/11703412.html

c++-多态和vptr指针

多态的原理 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Parent { public: Parent(int a) { this->a = a; } virtual void func(int a) { cout << "Parent::func(int)..." << endl; } virtual void func(int

常见C++面试题(三)

strcpy和memcpy有什么区别?strcpy是如何设计的,memcpy呢? strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符.(保证dest可以容纳src.) memcpy提供了一般内存的复制.即memcpy对于需要复制的内容没有限制,因此用途更广. strcpy的原型是:char* strcpy(char* dest, const char* src); char * strcpy(char * dest, const