C++ 计算vptr字段
我有几节课,我试图了解vptr和vtable在这种情况下是如何工作的C++ 计算vptr字段,c++,inheritance,polymorphism,vptr,virtual-table,C++,Inheritance,Polymorphism,Vptr,Virtual Table,我有几节课,我试图了解vptr和vtable在这种情况下是如何工作的 class RGB { short value[3]; }; class AbstractImage{ protected: int n_pixels; public: virtual void show() = 0; virtual AbstractImage* getMe() = 0; virtual ∼AbstractImage() {};
class RGB {
short value[3];
};
class AbstractImage{
protected:
int n_pixels;
public:
virtual void show() = 0;
virtual AbstractImage* getMe() = 0;
virtual ∼AbstractImage() {};
};
template <typename T> class Image: public AbstractImage {
T* data;
public:
Image<T>(int n) { n_pixles=n; data=new T[n_pixles];}
virtual ∼Image<T>() { delete[] data; }
Image<T>(const Image<T>& rhs) {
n_pixels = rhs.n_pixels;
data = new T[n_pixels];
copyData(rhs);
}
Image<T>& operator=(const Image<T>& rhs) {
n_pixels = rhs.n_pixels;
delete[] data;
data = new T[n_pixels];
copyData(rhs);
return *this;
}
virtual void show() {/*some code*/}
virtual Image<T>* getMe() {return this;}
private:
void copyData(const Image<T>& rhs) {
for(int i=0l i<n_pixels;i++) {
data[i] = rhs.data[i];
}
}
};
typedef class Image<RGB> ColorImage;
typedef class Image<short> BWImage;
据我所知,创建了两个vptr:
<> Pv>大多数VoPosits都有不同的值,但我们不能肯定。
首先,重要的是要知道C++标准不知道堆栈、堆和VPTR。因此,这里可以说的一切都取决于实现
我们可以从标准中推断出什么? 您的代码创建2个ColorImage
对象:
- 免费存储中的一个对象,具有动态存储持续时间(在您的术语中称为“heap”),并且哪个指针存储在
A
- 自动持续时间的本地对象(术语中称为“堆栈”)
- 这是两个不同的物体
vptr
指向与其具体(实)类型对应的虚拟表。大多数编译器对每个具体的类类型使用一个vptr
。因此,两个vptr
可能都指向同一个虚拟表
我希望AbstractImage
有一个虚拟表(它至少有一个虚拟函数成员),每个实例化的Image
(也就是说,Image
和Image
ColorImage
和BWImage
只是同义词。但正如所说,这只是假设,因为只要遵守标准,编译器就可以以不同的方式实现它
其他信息:
- :关于单一继承情况下的vptr和vptr布局的文章
- :关于单继承和多继承情况下使用
的内存布局的文章vptr
int main() {
AbstractImage* A = new ColorImage(4);
ColorImage B = colorImage(4);
A->show();
}