在阅读了很多关于 VTables 的内容后,我仍然有一个未解决的问题。
给定下一节课:
#include <iostream>
using namespace std;
class Shape {
public:
int* a;
Shape(){
cout<<"default Shape ctor"<<endl;
a = new int(15); // default
}
Shape(int n){
a = new int(n);
cout<<"Shape(n) constructor"<<endl;
}
// copy constructor
Shape(const Shape& s){
cout<<"copy constructor"<<endl;
a = new int(*(s.a));
}
Shape& operator=(const Shape& s){
cout<<"operator="<<endl;
if (&s == (this))
return (*this);
// this.clear();
a = new int(*(s.a));
return (*this);
}
virtual void draw(){
cout<<"print Shape the number is "<<*a<<endl;
};
virtual ~Shape(){
delete a;
cout<<"Shape distructor"<<endl;
}
};
class Circle : public Shape {
public:
int b;
Circle() {
cout<<"Circle constructor"<<endl;
b=5;
}
virtual void draw() {
cout<<"print Circle. The number is "<<b<<endl;
}
~Circle(){
cout<<"Circle distructor"<<endl;
}
};
和以下测试:
static void test2(){
Circle* c = new Circle();
cout<<"size of *c is "<<sizeof(*c)<<endl;
Shape* s = c;
cout<<"size of *s is "<<sizeof(*s)<<endl;
s->draw();
}
我得到这个输出:
default Shape ctor
Circle constructor
size of *c is 12
size of *s is 8
print Circle. The number is 5
我的问题是:我知道 s 如何寻址 Circle::draw,但是 s 怎么知道变量 b=5?正如该测试所示, s 没有此信息。我在这里想念什么?
谢谢!
好了朋友们。感谢您的快速回答...
我从您的回答中了解到 Circle::draw() (*this) 的类型是 Circle。好的。我现在的问题变成了这样:因为我只希望s是 Shape* 类型,也就是说,我在我的程序中只需要 Shape 质量。编译器会以某种方式获取接下来的 4 个字节(Circle 中的b变量)吗?如果是这样,显然 Circle::draw() 将无法按预期工作..
如果不是,编译器如何知道在 s 的“结束”之后我需要接下来的 4 个字节?