zoukankan      html  css  js  c++  java
  • VC++之 继承

    一.继承的引出

    自然界中很多客观事物具有很多共性,比如人与猿之间、火车与汽车之间、大炮与机枪之间,明显地有很多共性,但是它们之间又有很多不同。C++解决 “类似但有不同”问题的方法是——允许类从一个或多个其他类(在这里称为基类)继承其特性和行为,参看下面的例子:

    //---------------------------------------------------
    class PrintedDocument{
    //成员列表
    };
    //Book类从PrintedDocument类派生出来
    class Book: public PrintedDocument{
    //成员列表
    };
    //---------------------------------------------------



    我们称从其他类继承而来的类为派生类,而一个派生类本身也可以被其他类继承。必须以适当的方式对继承得到的成员进行访问。为了保证基类数据封装的安全,无论以何种继承方式得到的派生类都不能直接访问基类的private区成员。派生类的语法格式为:
        class 类名:<访问权限>基类名列表{类定义体};
    基类名列表中各基类用逗号隔开,访问权限可以是public或private,它们表示两种不同的继承方式:以public方式继承得到的成员属性与其基类中的属性相同;以private方式继承得到的成员属性将全部成为private属性。前面提到的protected区成员在使用上与private区成员完全一样,惟一不同只是在派生时,protected 区成员可以被派生类直接访问,即对派生类来说是可见的。例如:

    //---------------------------------------------------
    class Document{
        public:
        char *Name;
        void PrintNameOf();
    };
    //---------------------------------------------------
    void Document::PrintNameOf(){
        cout<<Name<<"
    ";
    }
    //---------------------------------------------------
    class Book:public Document{
        public:
        Book(char *name, long pagecount);
        private:
        long PageCount;
    };
    //---------------------------------------------------
    //Book类的构造函数
    Book::Book(char *name, long pagecount){
        Name=new char[strlen(name)+1];
        strcpy(Name, name);
        PageCount=pagecount;
    }
    //---------------------------------------------------

    二.类派生引出的成员覆盖问题

    在继承中,派生类包含所有的基类成员,同时加入自己的新成员,因此派生类可以根据派生时的成员访问机制访问基类的任何成员(除非这些成员在派生类中重新进行了定义)。当基类的成员在派生类中被重新定义时,可以用作用域操作符“∷”来强制调用基类成员。在上面的例子中,如果在Book中重新定义了PrintNameOf函数,而又要调用基类的PrintNameOf函数,只能通过作用域操作符“∷”强制调用,如下所示:

    //---------------------------------------------------
    class Book: public Document{
        public:
        Book(char *name, long pagecount);
        private:
        long PageCount;
    };
    //---------------------------------------------------
    void Book:: PrintNameOf(){
        cout<<"Name of book: ";
        Document:: PrintNameOf();
    }
  • 相关阅读:
    MapGuide 资源
    mac 安装brew
    mysql 设置外键约束SET FOREIGN_KEY_CHECKS=1
    一文深入讲解redis和couchbase的区别
    mac 显示 sh3.2# 的
    DBA整理的万字详解MySQL性能优化,值得收藏!
    redis和couchbase的比较
    && 运算符的使用
    freeotp 安装及使用过程
    Couchbase vs Redis,究竟哪个更胜一筹?
  • 原文地址:https://www.cnblogs.com/delphi2014/p/4060008.html
Copyright © 2011-2022 走看看