zoukankan      html  css  js  c++  java
  • “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;
    }
    

     输出结果为:

  • 相关阅读:
    [WebService]请求因 HTTP 状态 404 失败: Not Found。
    [WebService]请求因 HTTP 状态 400 失败: Bad Request。
    关于静态构造函数
    asp.net生成高质量缩略图通用函数
    ASP.NET 操作消息队列
    Asp.net 字符串操作类(补充引用)
    一行代码挂掉IE6,哈哈.......
    .Net代码生成器
    TSQL 跨库查询语句
    获取服务器地址的方法区别
  • 原文地址:https://www.cnblogs.com/kenler/p/10522237.html
Copyright © 2011-2022 走看看