C++中虚函数的陷阱

先来看看下面这段代码:

#include <iostream>
using namespace std;

class A{
public:
    virtual void print(){
        cout << "A::print()\n";
    }
};

class B : public A{
public:
    void print(int i = 0){
        cout << "B::print()\n";
    }
};

int main(){

    A *ptr = nullptr;
    B b;
    ptr = &b;

    ptr->print();
    b.print();
    b.print(1);
    b.A::print();

    return 0;
}

它的输出结果是:
这里写图片描述

我们发现当用基类的指针ptr去调用虚函数print()时,并没有和预想的一样动态绑定到派生类的print()函数。那么这是为什么呢?

事实上,虚函数要求的是基类与派生类完全相同的两个函数,在上面这个例子中,编译器把print()与print(int i = 0)看作两个不相关的函数,也自然不会有所谓“多态性”了。

补充一句,就算你想在派生类的print(int i = 0)后加上override也是不可行的:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_32925781/article/details/79567102