zoukankan      html  css  js  c++  java
  • C++第四课:类的使用(二)[个人见解]

    前面说到C++类的名字自定义要有含义,成员函数名也同样如此。

    一个好的程序员除了让自己能看懂代码外,那是能力,也能让别人看懂,那是本事。

    我们来看第一个特性:继承!

    什么是继承?

    小编不说概念性的定义,先举两个例子:

    1、你的身体流淌着的是父母的血统。

    2、你能学到老师的知识。

    能看出什么来?自己体会。

    那么在C++中如何继承呢?

    我们再创建一个类Teacher.h和Teacher.cpp两个文件。

    Teacher.h:

    #ifndef      __Teacher_h__
    #define     __Teacher_h__
    
    class Teachar
    {
    public:
    	Teachar();    
    	~Teachar();
    
    public:				//公有的属性或成员
    	
    	int get_KnowLedge()const;              //获取知识
    
    	char *get_Name()const;               //获取名字
    
    	int get_Age()const;                 //获取年龄
    
    	void print_information();             //打印所有的信息
    	int			t_knowledeg;		//知识
    	int			t_age;			//年龄
    	char			*t_name;		//名字
    
    protected:			//受保护的属性或成员
    
    private:			//私有属性或成员
    };
            
    

    Teacher.cpp

    #include "Teacher.h"
    #include <iostream>
    using namespace std;
     
    //构造函数
    Teachar::Teachar()
    {
        this->t_name = "visiousdragon";
        this->t_age = 29;
        this->t_knowledeg = 100;
    }
    
    Teachar::~Teachar()
    {
    }
    
    //获取知识
    int Teachar::get_KnowLedge() const
    {
        return this->t_knowledeg;
    }
    
    //获取名字
    char * Teachar::get_Name() const
    {
        return this->t_name;
    }
    
    //获取年龄
    int Teachar::get_Age() const
    {
        return this->t_age;
    }
    
    //获取信息
    void Teachar::print_information()
    {
        cout << this->get_Name() << "	" 
            << this->get_Age() << "	" 
            << this->get_KnowLedge() << endl;
    }

    创建好了后,我们来继承Teacher类.

    打开前面创建的Student.h头文件:

    #ifndef  __STUDENT_H__			//if not define 的简写,防止你创建的头文件是否被宏重复定义
    #define	 __STUDENT_H__
     
    #include "Teacher.h"
    
    //自定义Student类
    class Student
    	:public Teachar  /*,public Teacher2*/    //这就是继承Teacher的写法,当然也能多继承其他的类,只需要逗号隔开即可。注意:当开发时最好别继承太多的父类,以后你会懂。
    {
    public:
    	Student();		//构造函数
    	~Student();		//析构函数
    
    public:				//公有的属性或成员
    
    protected:			//受保护的属性或成员
    
    private:			//私有属性或成员
    	
    };
    #endif // ! __STUDENT_H__
    

    既然一切就绪,那我们来看看继承如何实现的。我们Student类内部可是什么都没有写的。

    打开主体源文件:

    #include <iostream>
    #include "Teacher.h"
    #include "Student.h"
    using namespace std;
    
    int main()
    {
    	Student student1;						//子类(派生类)继承了Teacher的成员函数,实例化也称创建一个类对象
    	student1.print_information();
    
    	Student *student2 = new Student;				//子类(派生类)继承了Teacher的成员函数,实例化也称生成一个类指针对象
    	student2->print_information();
    
    	Teachar *teahcer=&student1;					//子类对象引用给父类指针对象,相当于前面学得指针赋值int *p=&number;
    	teahcer->print_information();
    
    	system("pause");
    	return 0;
    }
    

    打印得结果是相同得,那我们就有一个疑惑,什么是继承?通俗得讲:继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。

    有人会问了,子类难道什么都不做吗,只管调用?那怎么可能呢!

    子类(派生类)继承了父类(基类),除了继承了父类得成员变量和成员函数外,也可以有自己的成员变量和成员函数。

    我们再来看看全新得Student.h头文件内部:

    #ifndef  __STUDENT_H__			//if not define 的简写,防止你创建的头文件是否被宏重复定义
    #define	 __STUDENT_H__
     
    #include "Teacher.h"
    
    //自定义Student类
    class Student
    	:public Teachar
    {
    public:
    	Student();		//构造函数
    	~Student();		//析构函数
    
    public:				//公有的属性或成员
    	void getTeacherInformation();
    	char *getTeacherName()const;
    	int getTeacherAge()const;
    	int getTeacherKnowledge()const;
    protected:			//受保护的属性或成员
    
    private:			//私有属性或成员
    	Teachar *teacher;    //将父类指针对象作为Student类的成员变量
    };
    #endif // ! __STUDENT_H__
    

    再看看全新Studnet.cpp文件内部:

     

    主体源文件:

    #include <iostream>
    #include "Student.h"
    using namespace std;
    
    int main()
    {
    	Student student1;	//子类(派生类)继承了Teacher的成员函数
    	student1.getTeacherInformation();
    
    	system("pause");
    	return 0;
    }
    

    运行看看,还是可以得到Teacher类内部的数据,不过调用的函数却是Student内部的函数,这就能肯定一点,Student类作为子类时,它可以继承父类的成员变量、函数,也可以拥有自己的成员变量、函数。

    有人会奇怪,为什么要在Student构造函数内部实例化Teacher的对象,因为它作为一个Student的成员变量,不实例化(初始化)这个对象,下面的三个函数就无法使用:

    ...
    char *Student::getTeacherName()const
    {
    	return teacher->get_Name();
    }
    int Student::getTeacherAge()const
    {
    	return teacher->get_Age();
    }
    int Student::getTeacherKnowledge()const
    {
    	return teacher->get_KnowLedge();
    }
    ...
    

    不信的可以试试,肯定为空,报出异常。

    也有人会奇怪,有的地方为什么写this->调用函数,这句this->代表就是当前所在的类指针对象,什么意思?

    说白了,它比结构体更简练,每个类都有一个看不见的指针对象,就是它本身,在Student内部使用就代表Student 的指针对象。

    当然说到这里不得不提一点,子类继承父类时,执行子类成员函数、构造函数、析构函数,或父类的成员函数、构造函数、析构函数,它都有优先级的。

    这里不多说了,可以上网搜搜,也可以在每个函数内部加句代码调试看看。

    记住:不是每个人都能把知识讲的非常全面,中间有时也要养成自己动手的能力,多听,多看,多敲,多多总结,努力吧!

    条条英符铸平凡,行行代码显乾坤;
  • 相关阅读:
    第二次作业
    自我介绍
    《JavaScript高级程序设计》读书笔记
    三种清理浮动的方式
    简单的水平导航条
    CSS——关于列表和导航条菜单之垂直菜单制作
    css中关于超链接的部分学习心得
    dubbox分布式框架 和相关依赖
    IO操作
    POI动态生成Excel
  • 原文地址:https://www.cnblogs.com/VisiousDragon/p/10602908.html
Copyright © 2011-2022 走看看