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();
    }
  • 相关阅读:
    Directx
    apr库开发
    linux 上編譯apache
    数字信号处理---FFT
    C# Parallel用法
    C#线程同步--线程通信
    C#线程同步--限量使用
    C#线程安全类型
    C# Task用法
    C# ThreadPool类(线程池)
  • 原文地址:https://www.cnblogs.com/delphi2014/p/4060008.html
Copyright © 2011-2022 走看看