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();
}
时间: 2024-10-11 00:44:43

VC++之 继承的相关文章

VC++之 继承(二)

C++多重继承的概念 由多个基类共同派生出派生类的继承结构称为多重继承或多继承(multiple-inheritance). 多重继承是从实际的需要产生的.例如:从大学在册人员产生学生和教职工.再从学生派生研究生.如果考虑到研究生可以当助教,那么他们又有了教职工的特性.教职工可分为教师和行政人员,但行政人员也可以去授课,兼有教师的特点等.这就是多继承,其继承关系如下图所示. 图 大学在册人员继承关系 多重继承下的歧义性问题及解决 问题1:教职工兼研究生,在其基类“教职工”中有一个“身份证号”,另

c/c++: c++继承 内存分布 虚表 虚指针 (转)

http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base { public:  int m_base; }; class DerivedA: public Base { public:  int m_derivedA; }; class DerivedB: public Base { public:  int m_derivedB; }; class DerivedC

谈VC++对象模型

一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节.对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释.Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些.因此,从篇幅和内容来看,译者认为本文是深入理解C++对象模型比较好的一个出发点. 这篇文章以前看到时就觉得很好,旧文重读,感觉理解得更多一些了,于是产生了翻译出来,与大家共享的想法.虽然文章不长,但时间有限,又若干次在翻译时打盹睡着

【转】c++继承中的内存布局

今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节.对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释. Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些.因此,从篇幅和内容来看,译者认为本文

C++类继承中内存的布局

1 前言       了解你所使用的编程语言究竟是如何实现的,对于C++程序员可能特别有意义.首先,它可以去除我们对于所使用语言的神秘感,使我们不至于对于编译器干的活感到完全不可思议:尤其重要的是,它使我们在Debug和使用语言高级特性的时候,有更多的把握.当需要提高代码效率的时候,这些知识也能够很好地帮助我们. 本文着重回答这样一些问题: 1* 类如何布局? 2* 成员变量如何访问? 3* 成员函数如何访问? 4* 所谓的"调整块"(adjuster thunk)是怎么回事? 5*

使用VB6资源文件开发多国语言应用攻略

VB6被很多程序员认为是一个过气的开发工具,但它实在是微软最经典的开发工具,没有之一!编译出的程序短小精悍,一般就几十K,而且从XP以后的操作系统,均携带其运行时库,只要程序只使用VB的标准控件,连安装都不需要,可以直接运行.所以,不太复杂的GUI程序我都使用VB6开发,速度那怎叫一个快字了得! 最近,我做了一个Mini流图软件,但需要支持多国语言.查了一下网上的资料,方案感觉都很山寨.基本上都是头疼医头,脚疼医脚,没有一个基于系统的全面调理方案.于是,仔细研究了VB6的资源文件体系,发现原来微

用 Swift 编写的工程代码静态分析命令行工具 smck

最近几周在用 swift 做一个命令行工具 smck 用来对现有 OC 工程的代码做些分析和处理.日后工程切换成 Swift 可以加上对 Swift 工程代码的支持.昨天看到喵神在微博上说他下周要直播 live coding 一个 swift 的命令行工具,传送门: 现场编程 - 用 Swift 创建命令行工具 fengniao-cli Part1 ,其实蛮期待.想想跟喵神挺有缘的,最近下了他开发的 iOS 应用 Mail Me,随时能够记录工作和准备讲座时一些灵感,smck 的一些实现还有模块

C++内存分布 虚表 虚指针(非常重要)

C++内存分布 虚表 虚指针: class Base { public: int m_base; }; class DerivedA: public Base { public: int m_derivedA; }; class DerivedB: public Base { public: int m_derivedB; }; class DerivedC: public DerivedA, public DerivedB { public: int m_derivedC; }; 类结构图:

Xcode6中如何使用自定义的类模板

说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewController 创建出来的ClassTemplateVC如下: #import "ClassTemplateVC.h" @interface () @end @implementation ClassTemplateVC - (void)viewDidLoad { [super viewDidLoa