一个非常简单的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”。我的问题是:
当
Foo::print()
是非虚函数时,为什么在将Bar
对象传递给Foo::时调用它? callPrint()
,是否存在类型(静态和动态)不匹配?当
Foo:callPrint()
是虚函数时,调用b.callPrint()
不是通过引用或指针,但是Bar::print()
被调用。这不是所谓的多态性,那么如何根据语言定义或编译器实现来解释这种行为?
最佳答案
当您调用 b.callPrint();
时,控制转移到基类中的函数 callPrint
。现在 this
的类型是 Foo *
,它指向 Bar *
的对象。现在,当您调用 print()
或 this->print()
在非虚函数的情况下,被调用的函数是在编译时根据
this
的类型决定的,因此调用Foo::print
。在虚函数的情况下,被调用的函数是在运行时根据指向对象的类型决定的,因此
<Bar::print
被调用。
您想增加更多乐趣吗?使函数 Foo::print()
成为一个 virtual
函数,并从 Foo
的构造函数中调用它,并创建一个 Bar 的对象
。
关于c++ - C++ 中反直觉的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37850882/