C++面试5题--5day
C++纯虚函数是什么?
纯虚函数是在基类中只声明、不定义的虚函数,它通过在声明末尾加上等于零来实现。它的主要作用是为派生类定义一个必须遵守的接口规范,任何继承这个基类的子类都必须自己实现这个函数。包含纯虚函数的类就成了抽象类,它不能被直接实例化创建对象,只能作为基类来使用,这强制保证了多态在使用时,调用的总是一个有具体实现的版本。
C++构造函数能不能是虚函数?
构造函数不能是虚函数。因为虚函数的调用依赖于一个叫做虚函数指针(vptr)的东西,而这个指针是在对象构造期间才会被初始化的。如果构造函数本身就是虚的,那么调用它就需要一个已经存在的虚函数机制,而这个机制有依赖于构造函数的完成。这就产生了一个逻辑矛盾。简单来说,在对象还没完全构造好之前,它的多态机制是无法工作的,所以构造函数不能是虚函数。
C++基类析构函数能不能是虚函数?
基类的析构函数可以是虚函数,而且在很多情况下是必须的。当您通过一个基类指针去删除一个派生类对象时,如果析构函数不是虚的,系统只会调用基类的析构函数,派生类的析构函数就不会被执行,这回导致派生类中分配的资源无法释放,造成内存泄漏。而如果将基类的析构函数声明为虚函数,那么在删除时,系统会通过多态机制正确地先调用派生类的析构函数,然后再调用基类的,从而保证整个对象被安全、完整的销毁。
C++模板函数能不能是虚函数?
模板函数不能是虚函数。这是因为虚函数是通过一个在编译期就确定下来的虚函数表(vtable)来实现的,表里存放的是固定函数的地址。而模板是在被具体类型实例化时才会生成最终的函数代码。编译器在编译阶段无法预知模板将会被哪些类型实例化,因此也无法在虚函数表中为这些未知的、可能无限多的函数版本预留位置。这两者的机制在时间点上是冲突的,所以C++禁止模板函数成为虚函数。
C++ 一个空类的大小?
一个空类的大小通常是一个字节。这听起来有点奇怪,但它不是零,因为C++标准规定,任何不同的对象都必须有唯一的内存地址。如果空类的大小是零,那么创建了多个空类对象时,它们的地址就会相同,程序就无法区分它们了。所以编译器会给空类对象分配一个字节的“占位符”,以确保其在内存中的唯一性。不过,如果这个类里包含了虚函数,那它的大小就不再是一字节了,而是一个指针的大小,因为需要存放指向虚函数表的虚指针。