• “C++动态绑定”相关问题探讨


    一、相关问题:

    1. 基类、派生类的构造和析构顺序

    2. 基类、派生类中virtual的取舍

    二、测试代码:

    #include <iostream>
    class A {
    public:
        A() {
            std::cout  << "A()" << std::endl;
        }
        virtual void print() { std::cout << "A print()" << std::endl; }
        virtual ~A() {
            std::cout  << "~A()" << std::endl;
        }
    };
    class B : public A {
    public:
        B() : A(){
            std::cout  << "B()" << std::endl;
        }
        virtual void print() { std::cout << "B print()" << std::endl; }
        virtual ~B() {
            std::cout  << "~B()" << std::endl;
        }
    };
    void print() {
    
    }
    int main(int argc, char *argv[])
    {
        A* c = new B();
        c->print();
        delete c;
        return 0;
    }
    

     三、探讨与结论:

    1. 基类、派生类的构造和析构顺序为:基类构造-派生类构造-派生类析构-基类析构

    上述代码输出结果为:

    2. 基类、派生类中virtual的取舍:若要实现动态绑定,基类中virtual关键字不可舍弃,派生类中virtual关键字可有可无;若基类中有关键字virtual,则普通函数调用派生类函数,析构函数先调用派生类,再调用基类;若基类中无关键字virtual,则普通函数和析构函数均只调用基类函数。

    测试代码1:基类无关键字virtual

    #include <iostream>
    class A {
    public:
        A() {
            std::cout  << "A()" << std::endl;
        }
        void print() { std::cout << "A print()" << std::endl; }
        ~A() {
            std::cout  << "~A()" << std::endl;
        }
    };
    class B : public A {
    public:
        B() : A(){
            std::cout  << "B()" << std::endl;
        }
        virtual void print() { std::cout << "B print()" << std::endl; }
        virtual ~B() {
            std::cout  << "~B()" << std::endl;
        }
    };
    void print() {
    
    }
    int main(int argc, char *argv[])
    {
        A* c = new B();
        c->print();
        delete c;
        return 0;
    }
    

     输出结果为:

    测试代码2:派生类无关键字virtual

    #include <iostream>
    class A {
    public:
        A() {
            std::cout  << "A()" << std::endl;
        }
        virtual void print() { std::cout << "A print()" << std::endl; }
        virtual ~A() {
            std::cout  << "~A()" << std::endl;
        }
    };
    class B : public A {
    public:
        B() : A(){
            std::cout  << "B()" << std::endl;
        }
        void print() { std::cout << "B print()" << std::endl; }
        ~B() {
            std::cout  << "~B()" << std::endl;
        }
    };
    void print() {
    
    }
    int main(int argc, char *argv[])
    {
        A* c = new B();
        c->print();
        delete c;
        return 0;
    }
    

     输出结果为:

  • 相关阅读:
    差分约束
    DevOps系列【centos 7离线安装中文版GitLab】
    Linux系列【硬盘的插入、分区、格式化、挂载】
    并发编程系列【ThreadLocal】
    Linux系列【从一台linux通过ssh登录另一台linux服务器】
    idea系列【配置git忽略文件和目录规则】
    网络编程系列【文件上传(C/S)】
    常见的问题系列【tar: Error is not recoverable: exiting now】
    网络编程系列【TCP通信原理】
    DevOps系列【Jenkinsfile+Dockerfile+nginx+vue】
  • 原文地址:https://www.cnblogs.com/kenler/p/10522237.html
Copyright © 2020-2023  润新知