虚函数的默认值

这两天写的代码涉及到虚函数的默认值,来记个笔记

主要是以下case:

class Base
{
public:
    virtual void print_msg(const char* msg = "Base")
    {
        std::cout << msg << std::endl;
        return;
    }
};

class Derived : public Base
{
public:
    virtual void print_msg(const char* msg = "Derived") override
    {
        std::cout << msg << std::endl;
        return;
    }
};

int main(void)
{
    Derived* ptr1 = new Derived;
    Base* ptr2 = ptr1;
    Base* ptr3 = new Base;
    
    ptr1->print_msg();
    ptr2->print_msg();
    ptr3->print_msg();
    
    delete ptr1;
    delete ptr3;
    return;
}

子类覆写了父类的虚函数,然而这个虚函数的参数在子类和父类中有不同的默认值,那么在实际运行中,默认值是以什么为准呢?

先说结论:
以运行时调用的类型为准。比如上面的例子中,ptr1是Derived类型的指针,那么通过ptr1调用print_msg函数,默认值就是Derived中函数参数的默认值;ptr2、ptr3是Base类型的指针,那么对应的,默认值就是Base中的默认值。

一开始,我以为这是在调用虚函数,读取虚函数表之前就已经先将参数压入栈中了,所以在压入参数时并不知道要跳转到的是什么函数。

不过我搞错了一件事,那就是默认值是在编译时期就确定的,所以是以编译时期可以看到的信息为准,也就是说调用时的变量类型决定了默认值究竟是什么。

原创文章 34 获赞 41 访问量 5945

猜你喜欢

转载自blog.csdn.net/qq_44844115/article/details/105699536
今日推荐