编程语言
首页 > 编程语言> > 【C++面试】虚函数和纯虚函数

【C++面试】虚函数和纯虚函数

作者:互联网

小米二面

在牛客网上的C++面筋题。

1. 虚函数和纯虚函数的区别

在这里插入图片描述

【纯虚函数的实现原理】
纯虚函数也一定是某个类的成员函数,含有纯虚函数的类叫做抽象类。在C++中,抽象类无法实例化对象。如果我们定义了Shape这样的类,那么,Shape类当中,因为有虚函数和纯虚函数,所以它一定有一个虚函数表,也就一定有一个虚函数表指针。在虚函数表当中,如果是纯虚函数,那么虚函数表中的函数指针值为0;如果是普通的虚函数,那就肯定是一个有意义的值。
在这里插入图片描述
一个虚函数的最简单的栗子:

#include <iostream>
using namespace std;

class A{
public:
    virtual void foo()
    {
        cout<<"A::foo() is called"<<endl;
    }
};
class B:public A
{
public:
    void foo()
    {
        cout<<"B::foo() is called"<<endl;
    }
};
int main(void)
{
    A *a = new B();
    a->foo();   // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
	system("pause");
    return 0;
}

在这里插入图片描述

2. 构造函数能不能是虚函数

不能。。C++在编译期间,就能确定你要创建的对象的具体类型,而这个具体类型包含了什么,继承了什么在编译期间也是明确的,即构建一个对象,必须知道具体的类型信息,构造什么也都是明确的,根本没必要存在虚构造函数。虚函数的存在是因为编译期间没法确定具体调用对象,才会有虚函数,虚函数表这么个东西。

解决方案:Bjarne建议用factory pattern,也就是为每一个要构建的类型再创建一个对应的factory,把问题放到factory的make方法中去解决。这也是C++中的通用解决方案。

Reference

[1] https://www.zhihu.com/question/35632207

标签:调用,函数,子类,C++,纯虚,基类
来源: https://blog.csdn.net/qq_35812205/article/details/122831020