C++面试题总结

为什么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 已经初始化了,况且我们通常通过基类的指针来销毁对象,如果析构函数不为虚的话,就不能正确的识别类型,就不能正确的销毁对象;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值