zoukankan      html  css  js  c++  java
  • C++初学 virtual 相关

    声明:
    1、为了节省篇幅,头文件和域什么的都没写。另外可能是java转C++,有些叫法可能会不对
    2、因初学,都是自己摸索的,有错望指出,勿喷
    假设父类声明
    Parent.h中如下
    class  Parent{
    public:
    Parent();
    ~Parent();
    virtual void printByParent();
    virtual void printVirtual();
    virtual void printVirtualAll()=0;
    void print();
    void invoke();
    };

    Parent.cpp 如下

    Parent::Parent(){}
     
    Parent::~Parent(){}
    void Parent::printVirtual(){
    cout<<"parent_printVirtual"<<endl;
    }
    void Parent::print(){
    cout<<"parent_printf"<<endl;
    }
    void Parent::printVirtualAll(){
    cout<<"parent_printVirtualAll"<<endl;
    }
    void Parent::printByParent(){
    cout<<"parent_printVirtualAll"<<endl;
    }
    void Parent::invoke(){
    this->print();
    this->printVirtual();
    this->printVirtualAll();
    this->printByParent();
    }

    1、是否是抽象类

    带virtual 声明方法的非抽象类:
        如果.h 文件中只有virtual void printVirtual();这样的声明,且在.cpp 文件中实现了。则,这个类是可以初始化的,非抽象类。
    抽象类两种情况:
        virtual void printVirtualAll()=0;如果这个类像这样声明了抽象方法,就算他再.cpp文件中实现了,这个类依然是抽象方法,不可直接初始化。
                                                         且无论这个方法在父类有没有实现,子类也必须实现这个方法后,才能成为非抽象方法
        virtual void printVirtual(); 像这样声明了,但是却没有在.cpp文件中实现,则,这个类也是抽象类。
                                                   如果这样声明的方法在父类中都有实现,其子类不覆写,依然是非抽象类
    2、继承关系
    有子类 ChildA 
    ChildA.h 如下
    class ChildA:public Parent{
    public:
    ChildA();
    ~ChildA();
    void printVirtual();
    void print();
    void printVirtualAll();
    };

    ChildA.app 如下

    ChildA::ChildA(){}
    ChildA::~ChildA(){}
    void ChildA::print(){
    cout<<"childA print"<<endl;
    }
    void ChildA::printVirtual(){
    cout<<"childA printVirtual"<<endl;
    }
    void ChildA::printVirtualAll(){
    cout<<"childA printVirtualAll"<<endl;
    }

     

    运行输出如下
     
    结果说明,只有父类声明了为virtual 的时候,子类覆写才有意义。
     
    相关的说明:
    void print(){//这个方法不是虚方法,子类自己实现,不影响
    void printVirtualAll(){//这个虚方法实现不实现都没关系,因为声明为=0,但是如果调用Parent::printVirtualAll还是有效的
    void printByParent(){//这个虚方法在这里设定测试为只父类实现,子类没有实现,正常调用
    virtual void printVirtual()// 这个虚方法在子类和父类中都有实现,子类对像输出是自己的实现
  • 相关阅读:
    网页页面合适的大小
    Spring IO Platform简介及示例
    Spring Boot 单元测试详解+实战教程
    Spring Boot日志集成
    Spring Boot 16 条最佳实践
    Spring Boot自动配置原理、实战
    Spring Boot自动配置
    Windows10 IME占用过高临时解决办法
    GitLab版本管理
    大型系统重构的步骤梳理
  • 原文地址:https://www.cnblogs.com/boliu/p/3393755.html
Copyright © 2011-2022 走看看