C中的反直觉功能调用

发布时间:2020-01-14 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了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”.我的问题是:

>当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中的反直觉功能调用所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:76874919,请注明来意。

脚本之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ” ,选择关注!
精选程序员所需精品干货内容!

标签: