#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()被调用.这不是所谓的多态性,那么如何解释这个行为,根据语言定义或编译器的实现?
>在非虚函数的情况下,被调用函数在编译时基于此类型决定,因此调用Foo :: print.
>在虚函数的情况下,被调用函数根据指向对象的类型在运行时间决定,从而调用bar :: print.
你想增加更多的乐趣吗?将Foo :: print()函数做成一个虚函数,并从Foo的构造函数中调用它,并创建一个bar的对象.
总结以上是内存溢出为你收集整理的C中的反直觉功能调用全部内容,希望文章能够帮你解决C中的反直觉功能调用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)