C中的反直觉功能调用

C中的反直觉功能调用,第1张

概述一个很简单的C代码: #include <iostream>using namespace std;class Foo {public: void callPrint() { print(); } void print() { cout << "Foo" << endl; }};class Bar : public F 一个很简单的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函数.现在的类型是Foo *,它指向bar *的一个对象.现在当你打印print()或this-> print()

>在非虚函数的情况下,被调用函数在编译时基于此类型决定,因此调用Foo :: print.
>在虚函数的情况下,被调用函数根据指向对象的类型在运行时间决定,从而调用bar :: print.

你想增加更多的乐趣吗?将Foo :: print()函数做成一个虚函数,并从Foo的构造函数中调用它,并创建一个bar的对象.

总结

以上是内存溢出为你收集整理的C中的反直觉功能调用全部内容,希望文章能够帮你解决C中的反直觉功能调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233076.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存