c ++:虚拟化是否会逐渐消失?

时间:2013-06-12 20:04:56

标签: c++ virtual-functions

我期待很容易找到那个答案,但是四处寻找并没有产生任何结果。

请考虑以下事项:

#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

我想知道标准中是否存在关于此类案例的令人信服的规则,还是依赖于平台?

2 个答案:

答案 0 :(得分:5)

  

我想知道标准中是否存在关于此类案例的令人信服的规则,还是依赖于平台?

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

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

您使用基类指针指向派生类(在本例中为SecondDerivative)对象,当您调用虚函数时,要调用的函数在运行时决定,在本例中为whoAmI { {1}}被调用。您可能还想查看SecondDerivativevirtual function有关如何实现C ++中的多态性的信息。 当派生类不覆盖虚函数的基类版本时,使用基类版本。在此处观看现场演示:Virtual function Demo

答案 1 :(得分:1)

它会像这样工作:

  • Base :: whoAmI() - &gt;我是基地
  • Derived :: whoAmI() - &gt;我是基地
  • SecondDerivative :: whoAmI() - &gt;我是二阶导数

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

这是标准的C ++行为,而非平台相关。