欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

默认参数的坑,虚函数入参的默认值不具有运行时多态性

程序员文章站 2022-05-28 18:06:33
...

      代码如下:

class A
{
public:
    virtual void Test(int a = 1)
    {
        std::cout << a << std::endl;
    }
};
class B : public A
{
public:
    virtual void Test(int a = 2)
    {
        std::cout << a << std::endl;
    }
};
int main()
{
    B b;
    A* p = &b;
    p->Test();
    system("PAUSE ");
}

      结果如下:

1
请按任意键继续. . .

      参数的默认值是在编译期间就已经决定的,而不是运行期间,编译期间不知道指针指向的是哪个对象,所以参数a的值默认为1。但是实际调用的还是子类的虚函数。编译器在编译时会将p->Test()修改成p->Test(1)。在运行期才知道Test(1)是调用的子类的函数,但是入参是编译期间就赋值好的。