c++:虚拟性是否会跳过几代人?

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

我是二阶导数

我想知道在标准中是否有关于这种情况的强制性规则,或者它是否依赖于平台?

最佳答案

I want to know if there is a compelling rule regarding such a case in the standard or is it platform dependent?

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

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

你使用基类指针指向派生类(在本例中为SecondDerivative)对象,当你调用虚函数时,调用哪个函数是在运行时决定的,在本例中,whoAmI SecondDerivative 的 > 被调用。您可能还想查看 virtual functionvtable,了解 C++ 中的多态性是如何实现的。 当您的派生类不覆盖虚函数的基类版本时,将使用基类版本。在此处查看现场演示:Virtual function Demo

关于c++:虚拟性是否会跳过几代人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074341/

相关文章:

C++:由于#include 循环,无法将对象实例传递给另一个类

c++ - 如何使用 Helvetica 字体固定列宽?

C#虚方法问题

UML 中的 C++11 可变模板参数表示法

c++ - 何时在 C++ 中使用引用作为参数

c++ - 在 C++/QT 中制作抽象类对象的 QList?

c++ - 关于标准中虚函数描述的一个问题

C++:使用抽象类的指针访问派生类的方法;派生类似乎也是抽象的

c++ - 具有前向声明类的 QSharedDataPointer

c++ - 虚拟方法会使应用程序变慢,但它们可以加快链接速度吗?