gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:45:37 27 4
gpt4 key购买 nike

我原以为可以轻松找到那个问题的答案,但四处搜索一无所获。

考虑以下几点:

#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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com