首页 > 代码库 > VC++之 继承

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<<"\n";}//---------------------------------------------------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();}

 

VC++之 继承