[C++程序语言设计笔记一]面向对象编程抽象,继承,重写基本介绍

简介:
今天是个不错的日子,不仅有人收了我做徒弟从此传授我有关C++的一些知识,由于前一段时间喜欢上了外挂的研究也用到了一些MFC的知识及一些Windows APIs编程,但是对C++还是没有从根本上认识。我从来没有过一个真正意义上的计算机老师(那些只会拿着课件给我念的不算),由于一路走来都只有我一个人,身边的人也全是学习科研的,美其名曰:生物工程,我想考过大学的人都知道这个科目的热度有多大---全国十大骗人专业之首。我放弃了我的专业的所有,一头投向计算机中,这可能也是由于我在高中就开始玩“黑客技术”以及我对计算机的敬仰之情所致。说了这么多,都是要感谢这位师傅,而且还是个女生,虽然我们是在网路上认识.....前一段时间看了《Windows核心编程》没有深入了解,谁都知道一本比较好的书没看个几遍是很难懂得他的精髓的,和我学习.NET一样(我看了红皮人头书WROX出版的《.NET入门经典》总共四遍,第一遍不知道说什么;第二编好像是这样;第三遍基本上懂一点;第四遍他才真正把我从VB中给带到C#过来而一发不可自拔,其实中间版本也有更替了现在应该是第4版了吧<怀疑中>)。今天师傅就推荐了一本《C++程序语言设计》今晚下班回来我就慢慢的读起,C++之父的著作应该不错,从今后的一些文章中我会记录一些我对C++的理解,我要把他从0开始的学期。开了他的写作方法不愧为一代大师,看的很爽很容易把我带入状态。
    
    C++中有头文件和实现文件共同来完成一个类或其他的方法,更术语一点是一个是声明,一个是定义,声明是让人能够在不同的程序页面或不同的DLL之间知道你到底有多少东西,这里也可以这样解释你到底想让人知道多少;而定义是你声明的函数(方法)是怎样完成一件事情的,也就是方法的实现。在《C++程序语言设计》中举了个堆栈的例子,例如我们在Stack.h中声明了一个类,而在Stack.cpp中实现了这个类的方法(当然要include头文件),当我们在其他页面中要用到Stack类时就要引用到Stack.h文件,如下图所示:
    下面我们来看看Stack.h的定义:
class Stack
{
public:
    Stack(int s);
    ~Stack(void);

private:
    const int max_size;
    char* v;
    int top = 0;

public:
    void push(char c);
    char pop();
    class Overflow{};//异常
    class Underflow{};//异常
    class BadSize{};//异常
};
    下面是实现Stack.h的Stack.cpp的定义:
 1  #include  " Stack.h "
 2 
 3  Stack::Stack( int  s)
 4  {
 5      top  =   0 ;
 6       if (s  <   0   ||  s  >   10000 )
 7           throw  BadSize();
 8 
 9      max_size  =  s;
10      v  =   new   char [s];
11  }
12 
13  Stack:: ~ Stack( void )
14  {
15      delete[] v;
16  }
17 
18  Stack::push( char  c)
19  {
20       if (top  ==  max_size)
21           throw  Overflow();
22          
23      v[top]  =  c;
24      top ++ ;
25  }
26 
27  Stack::pop()
28  {
29       if (top  =   0 )
30           throw  Underflow();
31      top -- ;
32       return  v[top];
33  }

    从上面我们就可以看出了怎样定义一个类,这个只是堆栈的一种,可能不同类型的堆栈他们的push和pop的方法实现的不一样,这样我们为了能够提供给多个类型使用面向对象的特性“继承”。把Stack类定义为一个抽象类型,而实现抽象类型中的方法的不同类型也称为多态类型。我们需要借助关键字virtual来声明,例如我们只要把上面的push和pop方法的声明改成如下所示:

     virtual   void  push( char  c) = 0 ;
    
virtual   char  pop() = 0 ;

     从上面我们可以看到声明后带着“=0”这个表示在继承的子类中必须重写此方法[如果你熟悉C#的话,我觉得这就是抽象abstract]。当然当我们应用到其他函数中是可以声明一个引用变量如下所示:

void  f(Stack &  s);
 
     这样将继承的子类实例引用到f的参数中就可以实现了[C#和这个很像,也许C#就是从这边接过来的东西,我是.NET的开发人员对此也比较熟悉就不多说了]。当我们子类继承基类时具有几个访问权限,通常我们使用的都是public关于这个我们在以后还会碰到这里就不多说了,要继承一个基类,必须包含基类的头文件,并在声明类的时候通过":"来实现继承如:ListStack:public Stack,子类的实现方式和其他一样。

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2007/09/17/cplusplus_pdl_notes_one.html,如需转载请自行联系原作者
相关文章
|
27天前
|
C++
8. C++继承
8. C++继承
22 0
|
27天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
32 0
|
1月前
|
C++
c++继承类型与多继承
c++继承类型与多继承
18 0
|
1月前
|
Java C++
C++-带你初步走进继承(2)
C++-带你初步走进继承(2)
28 0
|
安全 编译器 程序员
【C++】—— 继承
【C++】—— 继承
|
1月前
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
39 1
|
1月前
|
算法 安全 编译器
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
27 0
|
1月前
|
程序员 C++
|
27天前
|
安全 Java 编译器
C++:继承
C++:继承
30 0
|
30天前
|
安全 Java 编译器
C++:继承与派生
C++:继承与派生

热门文章

最新文章