C中的反直觉功能调用
发布时间:2020-12-16 07:52:23 所属栏目:百科 来源:网络整理
导读:一个很简单的C代码: #include iostreamusing 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
一个很简单的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()时,它是否被调用,是否有类型(静态和动态)不匹配? 解决方法
当你调用b.callPrint();控制转移到基类中的callPrint函数.现在的类型是Foo *,它指向Bar *的一个对象.现在当你打印print()或this-> print()
>在非虚函数的情况下,被调用函数在编译时基于此类型决定,因此调用Foo :: print. 你想增加更多的乐趣吗?将Foo :: print()函数做成一个虚函数,并从Foo的构造函数中调用它,并创建一个Bar的对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |