C++ 继承与派生

public_extends.cpp

#include <iostream>
using namespace std;
#include <string.h>

/********************************************
一、派生类的定义格式
class 派生类名:访问权限 基类名1,
                访问限定符 基类名2,……,
                访问限定符  基类名n
{
private:
    成员表1; //派生类增加或替代的私有成员
public:
    成员表2; //派生类增加或替代的公有成员
protected:
    成员表3; //派生类增加或替代的保护成员
};
********************************************/

/*--------------------------------------------
共有继承(public):

  继承特点:
    1、基类公有成员相当于派生类中的共有成员
    2、基类保护成员相当于派生类中的保护成员
    3、基类私有成员在派生类中无法直接访问

调用基类的成员:
    1、调用基类的成员变量:
        基类名::变量名;
    2、调用基类的成员函数:
        基类名::函数名();
---------------------------------------------*/

class Person
{
protected:
    char name[20];
    int age;
    char sex;
public:
    void Register(char* name, int age, char sex){
        strcpy(this->name, name);
        this->age = age;
        this->sex=(sex='m'?'m':'f');
    }
    void ShowMe(){
        cout<<this->name<<'\t'<<this->age<<'\t'<<this->sex<<endl;
    }
};

//基类公有成员相当于派生类中的共有成员
//基类保护成员相当于派生类中的保护成员
class Student:public Person
{
public:
    int number;
    char className[20];
public:
    void RegisterStu(char *className, int number, char* name, int age, char sex){
        strcpy(this->className, className);
        this->number = number;
        Person::Register(name, age, sex); //派生类成员函数直接使用基类的共有成员
    }
    void ShowStu(){
        cout<<this->number<<'\t'<<this->className<<endl;
        Person::ShowMe(); //直接使用基类的共有成员函数
        //cout<<Person::age<<endl; //调用基类的成员变量
    }
};

int test_public(){
    /*
    Person person;
    person.Register("覃唐弢", 21, 'm');
    person.ShowMe();
    */
    Student stu;
    stu.RegisterStu("软件技术",129781, "覃唐弢", 21, 'm');
    stu.ShowStu();
    stu.ShowMe(); //对象直接使用基类的共有成员

    return 0;
}

protected_extends.cpp

#include <iostream>
using namespace std;

/**********************************************************************
保护继承方式创建的派生类对基类各种成员访问权限如下:
    1、基类的公有成员和保护成员相当于派生类的保护成员
    2、派生类可以通过自身的成员函数或其子类的成员函数访问它们
    3、对于基类的私有成员,无论派生类内部成员或派生类使用者都无法直接访问
**********************************************************************/
class Person
{
protected:
    char name[20];
    int age;
    char sex;
public:
    void Register(char* name, int age, char sex){
        strcpy(this->name, name);
        this->age = age;
        this->sex=(sex='m'?'m':'f');
    }
    void ShowMe(){
        cout<<this->name<<'\t'<<this->age<<'\t'<<this->sex<<endl;
    }
};

class Student:protected Person //基类的公有成员和保护成员都相当于派生类的保护成员
{
public:
    int number;
    char className[20];
public:
    void RegisterStu(char *className, int number, char* name, int age, char sex){
        strcpy(this->className, className);
        this->number = number;
        Person::Register(name, age, sex); //派生类成员函数直接使用基类的共有成员
    }
    void ShowStu(){
        cout<<this->number<<'\t'<<this->className<<endl;
        Person::ShowMe(); //直接使用基类的共有成员函数
        //cout<<Person::age<<endl; //调用基类的成员变量
    }
};

int test_protected(){
    Student stu;
    stu.RegisterStu("软件技术",129781, "覃唐弢", 21, 'm');
    stu.ShowStu();
    //stu.ShowMe(); //error  基类的public函数 通过 protected 继承 在子类中 就成为了 protected 函数
    return 0;
}

private_extends.cpp

#include <iostream>
using namespace std;
#include <string.h>

/*************************************************************
二、私有继承(private)

 继承特点:
    1、基类的共有成员和保护成员相当于派生类的私有成员
    2、对于基类的私有成员,无论派生类内部成员
    或派生类使用者都无法直接访问
**************************************************************/

class Person
{
protected:
    char name[20];
    int age;
    char sex;
public:
    void Register(char* name, int age, char sex){
        strcpy(this->name, name);
        this->age = age;
        this->sex=(sex='m'?'m':'f');
    }
    void ShowMe(){
        cout<<this->name<<'\t'<<this->age<<'\t'<<this->sex<<endl;
    }
};

class Student:private Person //基类的共有成员和保护成员都相当于派生类的私有成员
{
public:
    int number;
    char className[20];
public:
    void RegisterStu(char *className, int number, char* name, int age, char sex){
        strcpy(this->className, className);
        this->number = number;
        Person::Register(name, age, sex); //派生类成员函数直接使用基类的共有成员
    }
    void ShowStu(){
        cout<<this->number<<'\t'<<this->className<<endl;
        Person::ShowMe(); //直接使用基类的共有成员函数
        //cout<<Person::age<<endl; //调用基类的成员变量
    }
};

int test_private(){
    Student stu;
    stu.RegisterStu("软件技术",129781, "覃唐弢", 21, 'm');
    stu.ShowStu();
    //stu.ShowMe(); //error  private继承方式 基类public的函数 在派生类 就成为了 private函数 所以在外部不能调用
    return 0;
}

///////////////////////////////

继承 Example

////////////////////////////////

Point.h

#ifndef POINT_H
#define POINT_H
class Point{
private:
    int x, y; //点x和y的坐标
public:
    Point(int=0, int=0); //构造函数
public:
    void setPoint(int, int); //设置坐标
    int getX(){
        return this->x;
    }
    int getY(){
        return this->y;
    }
    void printPoint();
};
#endif

 

Point.cpp

#include <iostream>
using namespace std;
#include "point.h"

Point::Point(int a, int b){
    this->setPoint(a, b);
}

void Point::setPoint(int a, int b){
    this->x = a;
    this->y = b;
}

void Point::printPoint(){
    cout<<"["<<this->x<<", "<<this->y<<"]";
}

Example.cpp

#include <iostream>
using namespace std;
#include "point.h"
#include "circle.h"

int test_point_circle(){
    Point p(30, 50);
    Circle c(120, 80, 10.0);
    cout<<"Point p:";
    p.printPoint();

    cout<<"\nCircle c:";
    c.printCircle();

    cout<<"The center of circle c:";
    c.Point::printPoint(); //调用 基类的 函数 ==> 变量名.基类名::函数名();

    cout<<"\nThe area of circle c:"
        <<c.area()<<endl;
    return 0;
}

 

/////////////////////////////

派生类的构造函数与析构函数

////////////////////////

#include <iostream>
using namespace std;
#include <string.h>

/***********************************************************************
派生类的构造函数和析构函数:

一、派生类构造函数的一般形式:
    派生类名::派生类名(参数总表):基类名1(参数表1),…,基类名n(参数表n),
    内嵌对象名1(对象参数表1),…,内嵌对象名m(对象参数表m)
    {
        派生类新增加成员的初始化;
    }

二、派生类构造函数各部分的执行次序
    1、调用基类构造函数,按他们在派生类定义的先后顺序调用
    2、调用内嵌对象构造函数,调用次序按各个对象在派生类内声明的顺序
    3、派生类的构造函数中的操作

三、派生类析构函数
    派生类析构函数执行过程与构造函数执行过程相反。
    (1)执行派生类析构函数
    (2)执行内嵌对象的析构函数
    (3)执行基类析构函数
***********************************************************************/

class Person{
public:
    char name[20];
    int age;
public:
    Person(char* name, int age){
        strcpy(this->name, name);
        this->age=age;
        cout<<"constructor of person...."<<endl;
    }
    ~Person(){
        cout<<"deconstructor of person...."<<endl;
    }
public:
    void ShowMe(){
        cout<<this->name<<'\t'<<this->age<<endl;
    }
};

class Student:public Person{
public:
    char className[20];
    Person Monitor; //内嵌对象
public:
     Student(char* name, int age, char* className, char* name1, int age1)
        :Person(name, age),Monitor(name1, age1)
    {
        strcpy(this->className, className);    
        cout<<"constructor of Student...."<<endl;
    }
    ~Student(){
        cout<<"deconstrucor of Student...."<<endl;
    }
public:
    void ShowStudent(){
        cout<<"基类对象"<<'\t';
            Person::ShowMe();
        cout<<"内嵌对象"<<'\t';
            Monitor.ShowMe();
        cout<<"派生类对象"<<'\t'<<this->className<<endl;
    }
};

int test_constructor_deconstrucor(){
    Student stu("覃唐弢", 21, "软件技术", "刘德华", 66);
    stu.ShowStudent();
    /*
        constructor of person.... //基类 构造函数
        constructor of person.... //内嵌对象 构造函数
        constructor of Student.... //派生类 构造函数
        基类对象        覃唐弢  21
        内嵌对象        刘德华  66
        派生类对象      软件技术
        deconstrucor of Student.... //派生类 析构函数
        deconstructor of person.... //内嵌对象 析构函数
        deconstructor of person.... //基类 析构函数
    */
    return 0;
}

 

////////////////////////////////////

多重继承

////////////////////////////////////

Base1.h

#ifndef BASE1_H
#define BASE1_H
class Base1{
private:
    int value;
public:
    Base1(int x){
        this->value = x;
    }
public:
    int getData() const{
        return this->value;
    }
};
#endif

Base2.h

#ifndef BASE2_H
#define BASE2_H
class Base2{
private:
    char letter;
public:
    Base2(char c){
        this->letter=c;
    }
public:
    /*
    表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,
    任意修改它所在的类的成员的操作都是不允许的
    因为隐含了对this指针的const引用
    */
    char getData() const{
        return this->letter;
    }
};
#endif

Derivde.h
#ifndef CIRCLE_H
#define CIRCLE_H

#include <iostream>
using namespace std;
#include "point.h"

class Circle:public Point //继承
{
private:
    double radius;
public:
    Circle(int x=0, int y=0, double r=0.0);
public:
    void setRadius(double); //设置半径
    double getRadius(); //取半径
    double area(); //计算面积
    void printCircle(); //输出圆心坐标和半径
};
#endif

Derived.cpp

#include <iostream>
using namespace std;
#include "derived.h"

Derived::Derived(int i, char c, double f):Base1(i),Base2(c)
{
    this->real = f;
}

double Derived::getReal() const{
    return this->real;
}

void Derived::outPut(){
    cout<<"Integer:"<<Base1::getData()
        <<"\nCharacter:"<<Base2::getData()
        <<"\nReal number:"<<this->real
        <<endl;
}

 

多重继承.cpp

#include <iostream>
using namespace std;
#include "derived.h"
int main(){
    Base1 b1(10), *base1Ptr=0;
    Base2 b2('Z'), *base2Ptr=0;
    Derived d(7, 'A', 3.5);
  
    cout<<"对象输出各自的数据成员"<<endl;
    cout<<"Object b1 contains integer:"<<b1.getData()
        <<"\nObject b2 contains character:"<<b2.getData()
        <<"\nObject d contains:\n";
    d.outPut();
    cout<<"派生类对象对基类成员函数的访问"<<endl;
    cout<<"Data members of Derived can be"<<"accessed individually:"
        <<"\nInteger:"<<d.Base1::getData() //访问父类的函数
        <<"\nCharacter:"<<d.Base2::getData()
        <<"\nReal number:"<<d.getReal()
        <<endl;
    cout<<"Derived can be treated as an"
        <<"object of either base class:\n";
    cout<<"派生类对象作为Base1对象"<<endl;
    base1Ptr = &d;
    cout<<"base1Ptr->getData() yields:"
        <<base1Ptr->getData()
        <<'\n';
    cout<<"派生类对象作为Base2对象"<<endl;
    base2Ptr = &d;
    cout<<"base2Ptr->getData() yields:"
        <<base2Ptr->getData()
        <<'\n';
    
    return 0;
}

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/qintangtao/p/2764376.html