C++常见面试题 ——虚函数

什么是虚函数

虚函数是指在类中,以virtual说明符进行描述的非静态成员函数

下面是一个虚函数应用的举例。

#include 

using namespace std;

//基类
class Base {
public:
    Base() = default;
    virtual void print() {
        cout << "Base" << endl;
    }

    virtual ~Base() = default;
};

//派生类
class Derived: public Base {
public:
    Derived() = default;
    void print() override {
        cout << "Derived" << endl;
    }
    ~Derived() = default;
};

class Derived_2: public Base {
public:
    Derived_2() = default;
    void print() override {
        cout << "Derived_2" << endl;
    }
    ~Derived_2() = default;
}

void test(Base *base) {
    base->print();
}

int main()
{
    Base *base1 = new Base();
    test(base1);

    Base *derived1 = new Derived();
    test(derived1);

    Base *derived2 = new Derived_2();
    test(derived2);
}

执行上述代码,可得:

$ ./test_virtual.exe 
Base
Derived
Derived_2

可以看到,在test函数中,对于同一个Base类的指针,入参为base1和base2所执行的print结果是不一样的,base1作为入参时test执行的是基类的print;而derived1作为入参时test执行的却是派生类Derived的print函数。
这就是C++中动态多态的概念(还有一种叫静态多态,是通过模板实现,在编译时实现,故称为静态),即使用基类(上面的Base)的指针(或引用)指向派生类对象,并调用对应的虚函数(上面的print)。这样对于同一个函数(上面的test),通过传入不同的对象,来执行对应对象的print实现。

动态多态(在运行时确定,故称为动态)必须满足两个条件:

  • 必须通过基类的指针或引用调用函数
  • 调用的函数必须为虚函数,并且派生类对基类的虚函数进行了覆写(override)

你可能感兴趣的:(c++,面试)