本文共 887 字,大约阅读时间需要 2 分钟。
这两天写的代码涉及到虚函数的默认值,来记个笔记
主要是以下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中的默认值。一开始,我以为这是在调用虚函数,读取虚函数表之前就已经先将参数压入栈中了,所以在压入参数时并不知道要跳转到的是什么函数。
不过我搞错了一件事,那就是默认值是在编译时期就确定的,所以是以编译时期可以看到的信息为准,也就是说调用时的变量类型决定了默认值究竟是什么。
转载地址:http://otxzi.baihongyu.com/