• 【c++】动态绑定


    C++的函数调用默认不使用动态绑定。要触发动态绑定,必须满足两个条件:

    1. 只有指定为虚函数的成员函数才能进行动态绑定
    2. 必须通过基类类型的引用或指针进行函数调用

    因为每个派生类对象中都拥有基类部分,所以可以使用基类类型的指针或引用来引用派生类对象

    示例

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct base
    {
        base(string str = "Base") : basename(str) {}
        virtual void print() { cout << basename << endl; }
        private:
            string basename;
    };
    struct derived : public base
    {
        derived(string str = "Derived") : derivedname(str) {}
        void print() { cout << derivedname << endl; }
        private:
            string  derivedname;
    };
    
    int main()
    {
        base b;
        derived d;
        cout << "b.print(), d.print()" << endl;
        b.print();
        d.print();
    
        base *pb = &b;
        base *pd = &d;
        cout << "pb->print(), pd->print()" << endl;
        pb->print();
        pd->print();
    
        base &yb = b;
        base &yd = d;
        cout << "yb.print(), yd.print()" << endl;
        yb.print();
        yd.print();
    }

    结果

     分析

    可以看出基类类型的指针或引用来引用派生类对象时,调用的是重定义的虚函数。要想覆盖虚函数机制,调用基函数的版本,可以使用强制措施。例:

    代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct base
    {
        base(string str = "Base") : basename(str) {}
        virtual void print() { cout << basename << endl; }
        private:
            string basename;
    };
    struct derived : public base
    {
        derived(string str = "Derived") : derivedname(str) {}
        void print() { cout << derivedname << endl; }
        private:
            string  derivedname;
    };
    
    int main()
    {
        base b;
        derived d;
        cout << "b.print(), d.print()" << endl;
        b.print();
        d.base::print();
    
        base *pb = &b;
        base *pd = &d;
        cout << "pb->print(), pd->print()" << endl;
        pb->print();
        pd->base::print();
    
        base &yb = b;
        base &yd = d;
        cout << "yb.print(), yd.print()" << endl;
        yb.print();
        yd.base::print();
    }

    结果

  • 相关阅读:
    JS创建类的方法--简单易懂有实例
    CommonJS, AMD, CMD是什么及区别--简单易懂有实例
    JS回调函数--简单易懂有实例
    单链表应用(2)--使用快慢指针,如何判断是否有环,环在哪个节点
    单链表应用(1)--使用快慢指针,找链表中间值
    自定义线性结构-有序Map
    C++中final和override
    双向链表翻转
    检查“()”是否匹配并返回深度
    是否存在K
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3509593.html
Copyright © 2020-2023  润新知