C++----继承

原创 2018年04月17日 19:10:16

       继承可以理解为一个类从另一个类获取成员变量和成员函数的过程,被继承的类称为基类(父类),继承的称为派生类(子类)。

        派生类除了拥有基类的函数和变量,还可以拥有心得成员函数和成员变量。

        使用继承可以尽可能的减少冗余代码。

可以使用继承的两个典型场景:

1) 当你创建的类与原来的类相似,只是多了几个成员函数或成员变量,可以使用继承;

2)当你要创建多个类时,他们拥有相似的成员变量或函数,可以使用继承。


【例】假如要建立一个学生人员统计的类,所有人都拥有姓名和年龄,还有出生日期,我们可以将姓名和年龄归为人员类,出生日期归为日期类,学生归为学生类。

#include<iostream>

using namespace std;

class People
{
    protected:
        string m_name;
    public:
        int m_age;
    public:
        People(string n,int a);
        ~People();
};

People::People(string n,int a)
{
    cout << "People constructor!" << endl;
  m_name = n;
    m_age = a;
}
People::~People()
{
    cout << "People Destructor!" << endl;
}


class Date
{
    private:
        int m_year;
        int m_month;
        int m_day;
    public:
        Date(int y,int m,int d);
        int Getyear();
 int Getmonth();
        int Getday();
        ~Date();
};

Date::Date(int y,int m,int d)
{
    cout << "Date Constructor!" << endl;
    m_year = y;
    m_month = m;
    m_day = d;
}

int Date::Getyear()
{
    return m_year;
}
int Date::Getmonth()
{
    return m_year;
}
int Date::Getmonth()
{
    return m_month;
}
int Date::Getday()
{
    return m_day;
}

Date::~Date()
{
    cout << "Date Destructor!" << endl;
}
class Student:public People
{
 private:
        Date m_birthday;
        int m_id;
    public:
        int m_age; //与父类同名的成员变量
    public:
        Student(string n,int a,int id,int y,int m,int d );
        ~Student();
        void show();
};

Student::Student(string n,int a,int id,int y,int m,int d):People(n,a),m_birthday(y,m,d)
{
    cout << "Student Constructor!" << endl;
    m_id = id;
}

void Student::show()
{
    cout << "年:" << m_birthday.Getyear() << " 月:" << m_birthday.Getmonth() << " 日:" << m_birthday.Getday() << endl;
    cout << "姓名:" << m_name << " 年龄:" << m_age << " 学号:" << m_id << endl;

}
Student::~Student()
{
    cout << "Student Destructor!" << endl;
}

int main()
{
    Student s("wang",23,1,1995,4,6);
    s.show();
    cout << "**********************" << endl;
    cout << &s << endl;
    cout << &s.m_age << endl;  //默认访问子类中m_age变量
 cout << &s.People::m_age << endl;
    cout << &s.Student::m_age << endl;
    cout << "**********************" <<endl;

    return 0;
}

结果:

People constructor!
Date Constructor!
Student Constructor!
年:1995 月:4 日:6
姓名:wang 年龄:4493300 学号:1
**********************
0xbff8cedc
0xbff8cef4
0xbff8cee0
0xbff8cef4
**********************
Student Destructor!
Date Destructor!
People Destructor!

当基类与子类出现同名成员变量时,系统默认访问子类变量,若想要访问基类的,要加限制符:基类::变量名。

不同的继承方式会影响基类成员在子类中的访问权限,以下这张表可归类此问题。


在C++中会出现数据类型转换,如把int型转换成char型。

类也是一种数据类型,也可以进行转换,不过这只有发生在基类和派生类之间才有意义。把子类赋值给基类称作向上转型,把基类赋值给子类叫向上转型,一般来说只能向上转型,若要向下转型只能手动输入。

#include<iostream>

using namespace std;

class Base
{
    private:
        int m_a;
    public:
        Base()
        {
            cout << "Base Construct!" << endl;
        }
};

class Derived:public Base
{
    private:
 int m_a;
    public:
    Derived()
    {
        cout << "Derived Construct!" << endl;
    }
};

int main()
{
    Base a;
    Derived b;
    a = b;   //将子类赋值给基类
    // b = a;  // 将基类赋值给子类,不可取,错误
    Base* p = &b; // 将子类指针赋值给基类
    //Derived* q = &a; // 将基类指针赋值给子类,错误
    return 0;

C++----继承和派生

引出类的继承和派生 在不同的类中,数据成员和成员函数是不同的,但有时,两个类的基本内容或有一部分相同,我们自然就想到,利用原来的类为基础,加上新的内容即可,以减少重复的工作量,C++继承就是解决这类问...
  • u013355826
  • u013355826
  • 2017-03-05 15:05:03
  • 183

c++的ppt课件

  • 2013年03月02日 21:15
  • 2.36MB
  • 下载

C++----语句

for语句头中的多重定义和其他声明一样,init-statement也可以定义多个对象。但是init-statement只能有一条声明语句,因此,所以变量的基础类型必须相同。for(int i = 0...
  • Love_wanling
  • Love_wanling
  • 2017-05-18 17:22:07
  • 161

C++----函数指针

函数指针是指向函数而非指向对象的指针,像其他指针一样,函数指针也是指向某个特定的类型,函数类型由其返回类型和形参表确定,与函数名无关。 void (*func)(int); 该语句将func声明为...
  • chaoshengmingyue
  • chaoshengmingyue
  • 2016-06-14 17:24:16
  • 213

C++----关联容器

关联容器概述关联容器(有序和无序的)不支持顺序容器的位置相关的操作,例如push_front或push_back。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。而且,关联容器也不...
  • Love_wanling
  • Love_wanling
  • 2017-07-04 15:53:58
  • 155

C++----动态内存

除了自动和static对象外,C++还支持动态分配内存对象。动态分配的对象的生存期与它们在哪里创建时无关的,只有当显示地被释放时,这些对象才会销毁。 动态对象的正确释放被证明是编程中及其容易出错的地...
  • Love_wanling
  • Love_wanling
  • 2017-07-10 17:06:17
  • 162

C++----表达式

求值顺序运算对象的求值顺序与优先级和集合率无关,在一条形如f()+g()*h()+j()的表达式中: 优先级规定,g()的返回值和h()的返回值相乘 结合律规定,f()的返回值先与g()和h()的乘积...
  • Love_wanling
  • Love_wanling
  • 2017-05-17 14:57:24
  • 157

C++----虚析构函数

虚函数是C++中用于实现多态的机制,主要是通过基类类型的指针指向其派生类的实例,然后通过基类的指针调用实际派生类的函数,从而实现多态。 /* 当基类指针指向派生类对象时,这种指针只能访问派生对象从基...
  • u012658346
  • u012658346
  • 2015-01-11 19:10:22
  • 369

C++----友元

友元存在的优缺点:友元的存在,破坏了类封装的属性,使得类的私有成员、保护成员能被其他友元类、友元函数访问。但是,也有它的好处就是,实现了数据、函数的共享,提高了系统的访问效率,减少了不必要的系统开销。...
  • dong6dong6
  • dong6dong6
  • 2017-08-05 14:10:59
  • 65

C++----引用

1、什么是引用?申明和使用引用要注意哪些问题? 答:引用就是某个变量的别名,对应用的操作与对变量直接操作相同。 (1)初始化:申明一个引用的时候切记要对它进行初始化引用申明完毕后。 (2)引用名...
  • KLNL100
  • KLNL100
  • 2013-07-12 17:25:24
  • 384
收藏助手
不良信息举报
您举报文章:C++----继承
举报原因:
原因补充:

(最多只允许输入30个字)