我期待很容易找到那个答案,但是四处寻找并没有产生任何结果。
请考虑以下事项:
#include <iostream>
class Base
{
public:
virtual void whoAmI()
{
std::cout << "\nI'm base\n" ;
}
};
class Derived : public Base
{
};
class SecondDerivative : public Derived
{
public:
virtual void whoAmI()
{
std::cout << "\nI'm Second derivative\n" ;
}
};
int main()
{
SecondDerivative SD;
Base* b = &SD;
b->whoAmI();
return 0;
}
我知道在使用指针时应该调用运行时类型的虚函数。但在此示例中,直接派生类不实现虚函数,但在使用原始基类指针时会调用其派生类的函数。
使用g ++构建并运行show:
I'm Second derivative
我想知道标准中是否存在关于此类案例的令人信服的规则,还是依赖于平台?
答案 0 :(得分:5)
我想知道标准中是否存在关于此类案例的令人信服的规则,还是依赖于平台?
您的代码示例显示了C ++中的标准多态性,它依赖于不平台。
Base* b = &SD;
b->whoAmI();
您使用基类指针指向派生类(在本例中为SecondDerivative)对象,当您调用虚函数时,要调用的函数在运行时决定,在本例中为whoAmI
{ {1}}被调用。您可能还想查看SecondDerivative
和virtual function
有关如何实现C ++中的多态性的信息。 当派生类不覆盖虚函数的基类版本时,使用基类版本。在此处观看现场演示:Virtual function Demo
答案 1 :(得分:1)
它会像这样工作:
b-&gt; whoAmI()会调用SecondDerivative :: whoAmI(),除非有特殊情况。例如,如果你从Base :: Base()调用whoAmI(),它将调用Base :: whoAmI(),而不是SecondDerivative :: whoAmI(),即使该对象是SecondDerivative。
这是标准的C ++行为,而非平台相关。