【发布时间】:2011-03-11 12:56:44
【问题描述】:
我有这些课程:
class Base
{
public:
virtual void foo(int x = 0)
{
printf("X = %d", x);
}
};
class Derived : public Base
{
public:
virtual void foo(int x = 1)
{
printf("X = %d", x);
}
};
当我有:
Base* bar = new Derived();
bar->foo();
我的输出是“X = 0”,即使 foo 是从 Derived 调用的,但是当我有时:
Derived* bar = new Derived();
bar->foo();
我的输出是“X = 1”。这种行为正确吗? (从声明类型中选择默认参数值,而不是从实际对象类型中选择它)。这会破坏 C++ 多态性吗?
如果有人在没有指定实际函数参数的情况下使用虚函数并使用函数的默认参数,则会导致很多问题。
【问题讨论】:
-
在 printf() 中添加一些内容,它实际上会告诉您正在调用哪个函数
-
很明显被调用的函数是Derived::foo
-
怎么样?他们都打印类似“X = value”的东西。您不能使用该值来确定正在调用哪个值。尝试在 base 中打印“Base: X = %d”,您将能够分辨出调用的是哪一个。
标签: c++