0

我原以为很容易找到那个答案,但四处寻找却一无所获。

考虑以下:

#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++ 构建并运行显示:

I'm Second derivative

我想知道标准中是否有关于这种情况的令人信服的规则,或者它是否依赖于平台?

4

2 回答 2

5

我想知道标准中是否有关于这种情况的令人信服的规则,或者它是否依赖于平台?

您的代码示例显示了 C++ 中的标准多态性,它依赖于平台。

  Base* b = &SD;
  b->whoAmI();

您使用基类指针指向派生类(在这种情况下为SecondDerivative)对象,当您调用虚函数时,调用哪个函数在运行时决定,在这种情况下,调用whoAmIof SecondDerivative。您可能还想了解 C++ 中的多态性是如何实现的virtual function当您的派生类没有覆盖虚函数的基类版本时,将使用基类版本。在此处查看现场演示:虚拟功能演示vtable

于 2013-06-12T20:10:34.097 回答
1

它会像这样工作:

  • Base::whoAmI() -> 我是基地
  • Derived::whoAmI() -> 我是基础
  • SecondDerivative::whoAmI() -> 我是二阶导数

b->whoAmI() 将调用 SecondDerivative::whoAmI(),除非有特殊情况。例如,如果您从 Base::Base() 调用 whoAmI(),即使对象是 SecondDerivative,它也会调用 Base::whoAmI(),而不是 SecondDerivative::whoAmI()。

这是标准 C++ 行为,与平台无关。

于 2013-06-12T20:22:50.617 回答