c++ - 从继承函数中调用虚函数?

标签 c++ inheritance polymorphism virtual-functions

我试图在脑海中描绘出它,但老实说,我不知道这里到底发生了什么。
当我在下面的示例中添加和删除虚拟关键字时,到底发生了什么

#include <iostream>
#include <string>

class A {
public:
    A() { me = "From A"; }
    void caller() { func(); }
    virtual void func() { std::cout << me << std::endl; } // THIS LINE!
private:
    std::string me;
};

class B : public A {
public:
    B() { me = "From B"; }
    void func() { std::cout << me << std::endl; }
private:
    std::string me;
};

int main() {
    A a;
    a.caller();
    B b;
    b.caller();
    return 0;
}

使用 virtual 关键字,它打印“From A”,然后是“From B”。
如果没有 virtual 关键字,它会打印“From A”,然后是“From A”。

到目前为止,这是我唯一一次发现不涉及指针的虚函数的用途。我认为如果删除 virtual 关键字,编译器会做标准的事情,即重载继承的函数并最终打印“From A”和“From B”。

我认为这不仅仅是 VTable 更深入,而且更多的是关于它在特定情况下的行为方式。 B 有 VTable 吗?

最佳答案

电话

func()

相当于

this->func()

所以涉及到一个指针。

不过,无需涉及指针即可理解该行为。

甚至直接调用例如b.func() 必须像 一样工作,这是一个虚拟调用,而 func 在静态已知类型中是虚拟的。编译器可以根据了解 b 的最派生类型对其进行优化。但这是另一种考虑(优化几乎可以做任何事情)。

关于c++ - 从继承函数中调用虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25700841/

相关文章:

c++ - (void**) 在 C 中是什么意思?

c++ - 什么时候通过引用传递函数参数,什么时候通过地址传递?

c# - 如何防止具有公共(public)派生类的抽象类被其他程序集继承?

python - 返回类型取决于 Python 中的输入类型

c++ - 为什么多态性不适用于 C++ 中的数组?

c++ - 如何将对象指针与动态数组一起使用

c++ - 文件警告末尾的反斜杠换行符

c# - 确定类是否是具有多个泛型参数的类型的子类

c++ - 当基类为抽象时,声明子类的对象

c++ - 具有历史的搜索结构(持久性)