9得票3回答
多态类的vptr(指向虚函数表)何时被初始化?

这不是关于“VTABLE何时创建?”的问题。相反,VPTR应该在什么时候初始化?是在构造函数的开始/结束之前/之后? A::A () : i(0), j(0) -->> here ? { -->> here ? //... -->> here...

9得票2回答
识别主要基类的类型特征

如果我有一个名为Base的类,至少有一个虚函数,另外还有一个继承自它的单一类Derive。那么根据Itanium ABI,(uintptr_t)derived - (uintptr_t)static_cast<Base*>(derived)的结果保证为零,即使Derived不是标准...

9得票5回答
C++中的虚表指针是在什么时候为一个对象设置的?

我知道对于任何具有虚函数或派生自具有虚函数的类,编译器会做两件事。首先,它为该类创建虚表;其次,在对象的基本部分中放置一个虚指针(vptr)。在运行时,当对象被实例化时,vptr被分配并开始指向正确的虚表。 我的问题是,在实例化过程中到底在什么地方设置了这个vptr?这个vptr的赋值是在对...

8得票4回答
当派生类没有覆盖虚函数时,为什么需要vptr?

class base { public: void virtual fn(int i) { cout << "base" << endl; } }; class der : public base{ public: vo...

8得票5回答
虚表和_vptr存储方案

有人能解释一下不同类的虚拟表是如何存储在内存中的吗?当我们使用指针调用函数时,它们如何使用地址位置来调用函数?我们可以使用类指针获取这些虚拟表内存分配大小吗?我想看看一个类的虚拟表使用了多少内存块。我该如何查看? class Base { public: FunctionPointe...

8得票1回答
非多态类型上的dynamic_cast

我能理解为什么在这种情况下 dynamic_cast 起作用: #include <iostream> struct A{ virtual ~A() = default; }; struct B { virtual ~B() = default; }; st...

8得票3回答
在这个例子中会创建多少个vtable和vpointer?

这里是关于虚函数表的程序。我的理解是关于虚函数表和虚函数指针的。 Class B { public: virtual Void Hello() { cout<<"Hello Base"; } }; class D: public B { p...

8得票1回答
虚函数表:底层算法

我的理解是,如果我有一个类Cat,并且这个类有一个虚函数speak(),然后分别有Lion和HouseCat两个子类,那么就会有一个vtable,将speak()映射到每个子类的正确实现。因此,调用 cat.speak() 编译为 cat.vtable[0]() 也就是说,查找vt...

7得票2回答
为什么带有虚函数的类中vptr被存储为内存中的第一个条目?

对于某些编译器,如果一个类有虚函数,则可以通过其对象的第一个字节的地址来访问其vptr。例如: class Base{ public: virtual void f(){cout<<"f()"<<endl;}; virtual void g(){cou...

7得票3回答
为什么我的C++对象会失去其VPTr

在调试程序的核心转储时,我遇到了这样一种情况:它包含的多态对象失去了其VPTr,我可以看到它指向NULL。 当一个对象失去其VPTr时可能发生什么情况。 提前感谢, Brijesh