C++ 动态绑定和静态绑定

  1. virtual 函数实现多态性
    #include <iostream>
    
    using namespace std;
    struct TreeNode
    {
        TreeNode *left;
        TreeNode *rignt;
    };
    class Generic_parser
    {
    public:
        void parse_preorder(TreeNode *node)
        {
            if (node) {
                process_node(node);
                parse_preorder(node->left);
                parse_preorder(node->rignt);
            }
        }
    private:
    //    void process_node(TreeNode* node){
    //        static_cast<T* >(this)->process_node(node);
    //    }
        virtual void process_node(TreeNode *node)=0;
    };
    
    class EmployeeChart_Parser: public Generic_parser
    {
    public:
        void process_node(TreeNode *node) override
        {
            cout << "Customized process_node() for EmployeeChart.\n" << endl;
        }
    };
    int main()
    {
        TreeNode root;
        TreeNode left;
        left.left = nullptr;
        left.rignt = nullptr;
    
        TreeNode right;
        right.left = nullptr;
        right.rignt = nullptr;
        root.left = &left;
        root.rignt = &right;
        EmployeeChart_Parser ep;
        Generic_parser *p = &ep;
        ep.parse_preorder(&root);
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }

    我们定义了一个抽象类Generic_parser ,  让EmployeeChart_Parser 类继承Generic_parser,实现了使用基类的指针调用派生类的方法

  2. 静态绑定
     

    #include <iostream>
    
    using namespace std;
    struct TreeNode {TreeNode* left; TreeNode* rignt;};
    template <typename T>
    class Generic_parser
    {
    public:
        void parse_preorder(TreeNode* node)
        {
            if(node)
            {
                process_node(node);
                parse_preorder(node->left);
                parse_preorder(node->rignt);
            }
        }
    private:
        void process_node(TreeNode* node){
            static_cast<T* >(this)->process_node(node);
        }
    };
    
    class EmployeeChart_Parser: public Generic_parser<EmployeeChart_Parser>
    {
    public:
        void process_node(TreeNode* node)
        {
            cout << "Customized process_node() for EmployeeChart.\n" << endl;
        }
    };
    int main()
    {
        TreeNode root;
        TreeNode left;
        left.left = nullptr;
        left.rignt = nullptr;
    
        TreeNode right;
        right.left = nullptr;
        right.rignt = nullptr;
        root.left = &left;
        root.rignt = &right;
        EmployeeChart_Parser ep;
        auto *p = &ep;
        p->parse_preorder(&root);
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }

    我们定义了一个模板基类,模板参数派生类名,接口中将基类的指针强制转换为派生类的指针来实现调用派生类的方法。

  3. 两者的区别:virtual 函数实现的的动态绑定,需要维护虚指针和虚表因此速度慢,而模板的方法是用静态绑定的方式实现多态性,程序执行速度更快,但是编译速度更慢。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值