首页 > 试题广场 >

以下程序输出是什么?

[单选题]
以下程序输出是什么?
class classA
{
public:
 classA()
 {
 clear();
 }
 virtual ~classA()
 {
 }
 void clear()
 {
 memset(this , 0 , sizeof(*this));
 }
 virtual void func()
 {
 printf("func\n");
 }
};
class classB : public classA
{
};

int main(void)
{
 classA oa;
 classB ob;
 classA * pa0 = &oa;
 classA * pa1 = &ob;
 classB * pb = &ob;

 oa.func();         // 1
 ob.func();         // 2
 pa0->func();       // 3
 pa1->func();       // 4
 pb->func();        // 5

 return 0;
}

  • func func 执行出错 执行出错 func
  • 执行出错 func 执行出错 执行出错 func
  • 执行出错 执行出错 执行出错 执行出错 执行出错
  • func func func func func
  • func func 执行出错 func func
  • 以上选项都不对
E,
理解这个题,需要理解C++对象模型和this指针。
1,2就不多解释了,12的调用并没有用到虚指针,当然不会有问题。
关于3,首先this指针指向的是该对象的首地址,本来ClassA在定义的时候并没有定义什么私有数据成员,但是因为它有一个成员函数是虚函数,这导致它会内部增加一个指针,该指针指向ClassA的虚函数表的首地址(也是第一个虚函数的地址),虚函数表其实是实现多态的关键技术,这里不多说,有兴趣的同学可以去百度。
但是我门现在调用memset把内部的虚指针的值置为0了(该虚指针),当我通过指针去访问该虚函数时,自然就会出现段错误了,
关于4,5,我只是作点猜测。因为B对象生成的时候,会先生成一个A对象,在这里会先调用A的默认构造函数,当然调用后虚指针的值变成了0,   但是当生成B对象的时候,虚指针的值被重置了,因此能正确访问。
发表于 2015-08-10 11:28:58 回复(0)
func func 执行出错 func func 因为在A的构造函数当中使用memset(this, 0, sizeof(*this)),把自身成员当中指向虚函数表的指针vptr给赋值0,
所以通过A自身的对象无法找到虚函数,所以不能执行。
另外在构造函数当中使用memset(this, 0, sizeof(*this))很危险。相当于在构造函数中使用析构函数吧。
发表于 2015-08-10 11:19:05 回复(0)
1.func 2.func 3.执行出错 4.func 5.func
发表于 2014-11-17 16:13:19 回复(1)