首页 > 试题广场 >

#include #includ...

[单选题]
#include <iostream>
#include <cstring>
 
class Base {
public:
    virtual void f() { std::cout << "Base::" << i << std::endl; };
    void clear() { memset(this, 0, sizeof(Base)); }
    int i;
};
 
class Derive: public Base {
public:
    void f() {
        std::cout << "Derive::" << i << std::endl;
    }
};
 
int main() {
    Base* p = new Derive();
    p->i = 2019; 
    p->clear();
    p->f();
    delete p;
    return 0;
}
  • Base::0
  • Derive::0 
  • Derive::2019 
  • 异常
正常来说会申请int(4)个内存空间,但是memset(this, 0, sizeof(Base)); 会申请8个,因为C++为了实现多态机制,所有有虚函数的对象都会有一个指向一个虚函数表的指针,而使用memset时会把这个虚函数指针也给重置为0,从而造成指针与表的连接断开,从而引发异常
注意这里的Derive的f函数省略了override修饰符

拓展阅读:C++虚函数详解https://blog.csdn.net/haoel/article/details/1948051

编辑于 2020-01-17 11:17:32 回复(0)