默认参数的坑,虚函数入参的默认值不具有运行时多态性
程序员文章站
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)是调用的子类的函数,但是入参是编译期间就赋值好的。