c++ - C++ 中反直觉的函数调用

标签 c++

一个非常简单的C++代码:

#include <iostream>

using namespace std;

class Foo {
public:
    void callPrint() {
        print();
    }
    void print() {
        cout << "Foo" << endl;
    }
};

class Bar : public Foo {
public:
    void print() {
        cout << "Bar" << endl;
    }
};

int main() {
    Bar b;
    b.callPrint();

    return 0;
}

这里的输出是“Foo”。如果我将“Foo::print()”设为虚拟,则输出将是“Bar”。我的问题是:

  1. Foo::print() 是非虚函数时,为什么在将 Bar 对象传递给 Foo::时调用它? callPrint(),是否存在类型(静态和动态)不匹配?

  2. Foo:callPrint() 是虚函数时,调用 b.callPrint() 不是通过引用或指针,但是 Bar::print() 被调用。这不是所谓的多态性,那么如何根据语言定义或编译器实现来解释这种行为?

最佳答案

当您调用 b.callPrint(); 时,控制转移到基类中的函数 callPrint。现在 this 的类型是 Foo * ,它指向 Bar * 的对象。现在,当您调用 print()this->print()

  1. 在非虚函数的情况下,被调用的函数是在编译时根据this的类型决定的,因此调用Foo::print

  2. 在虚函数的情况下,被调用的函数是在运行时根据指向对象的类型决定的,因此 Bar::print 被调用。

    <

您想增加更多乐趣吗?使函数 Foo::print() 成为一个 virtual 函数,并从 Foo 的构造函数中调用它,并创建一个 Bar 的对象

关于c++ - C++ 中反直觉的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37850882/

相关文章:

c++ - 使用 C++ 的文件修改回调?

c++ - 匹配提升 :none in UTs

c++ - 这是什么样的代码? C 或 C++

c++ - 在文本文件中识别编程语言的代码

c++ - 如何实时捕捉摄像头的视频?

c++ - Qt_USE_MATH_DEFINES

c++ - 不确定如何在 main() 中将参数从类传递到构造函数

c++ - 你好,关于函数的程序(按引用传递/按值传递)我不完全确定我的程序出了什么问题

c++ - 如何打印列表 <class*> ls?

java - 重新在 java 中使用 C++ 图形代码