C++面试题总结

来源:互联网 发布:阿里云 王坚 年会 哭 编辑:程序博客网 时间:2024/05/29 19:45

为什么C++的member function template不能是虚的?

问题的意思是:为什么在C++里面,一个类的成员函数不能既是template优势virtual,比如,下面的代码是不合法的:

class Animal{public:    template<typename T>    virtual void make_sound(){        //...    }   };

原因如下:
1. 从Uuix/C开始,一个C/C++程序就可以被分开编译,然后用一个linker链接起来。这种模型有有一个问题,就是各个编译单元可能对另一个编译单元一无所知。
2. 一个function template最后到底会被实例化为多少个函数,要等到整个程序(所有的编译单元)全部被编译完成才知道。
3. 同时,虚函数的实现大多利用了一个“虚函数表”的东西,这种实现中,一个类的内存布局(或者说虚函数表的内存布局)需要在这个类编译完成的时候就被完全确定。
所以,由以上的矛盾可知,C++的member function不能既是template又是virtual。

变量作为数组长度

在栈上为什么不能用变量做数据的长度,在堆上可以吗?
—堆上可以,栈上不可以,栈上的地址空间只有在发生函数调用的时候才可以通过ebp指针来确定地址,堆上可以直接确定地址,可以直接寻址。

C++:构造函数和析构函数能否为虚函数?

  • 构造函数不能为虚函数
    C++对象在三个地方构建:
    (1):函数堆栈;(2):自由存储区,或称之为堆;(3):静态存储区;

    无论在哪儿构建,其过程都是两步:

    • 分配一块内存
    • 调用构造函数

    如果构造函数是虚函数,那么就需要通过vtable来调用,但此时面对的是一块raw memory,到哪里去找vtable呢?毕竟vtable是在构造函数中才初始化的,而不是在其之前,因此构造函数不能是虚函数;

  • 析构函数可以是虚函数,且常常如此
    因为此时vtable 已经初始化了,况且我们通常通过基类的指针来销毁对象,如果析构函数不为虚的话,就不能正确的识别类型,就不能正确的销毁对象;