C++入门--继承

一、组合与继承

举例:

 1 #include <iostream>
 2 
 3 class CPerson {
 4 public:
 5     CPerson() {}
 6     ~CPerson() {}
 7     //获取性别
 8     int GetGender() {
 9         return m_nGender;
10     }
11     //设置性别
12     void SetGender(int nGender) {
13         m_nGender = nGender;
14     }
15 private:
16     char m_szName[255];
17     int m_nGender;
18 };
19 
20 class CStudent
21 {
22 public:
23     CStudent() {}
24     ~CStudent() {}
25     CPerson m_per;  //把一个类放到另一个类里做成员--组合关系
26 private:
27     int m_nStuID;
28 };
29 
30 class CTeacher
31 {
32 public:
33     CTeacher() {}
34     ~CTeacher() {}
35     CPerson m_per;
36 private:
37     int m_TeaID;
38 };
39 
40 int main()
41 {
42     CStudent stu;
43     stu.m_per.SetGender(1);
44     return 0;
45 }

在上面我们通过在学生类与教师类中包含person类,来使他们获取person的一些属性。这种关系,我们称之为组合关系

#include <iostream>

class CPerson {
public:
    CPerson() {}
    ~CPerson() {}

    int GetGender() {
        return m_nGender;
    }

    void SetGender(int nGender) {
        m_nGender = nGender;
    }
private:
    char m_szName[255];
    int m_nGender;
};

class CStudent:public CPerson
{
public:
    CStudent() {}
    ~CStudent() {}
private:
    int m_nStuID;
};

class CTeacher:public CPerson
{
public:
    CTeacher() {}
    ~CTeacher() {}
private:
    int m_TeaID;
};

int main()
{
    CStudent stu;
    stu.SetGender(1);
    return 0;
}

除了组合,更方便的还可以用继承实现。

继承:子类 ---->父类   派生类--->基类

二、继承的可见性

继承的可见性在什么时机做的检查?

 是编译器在编译的时候做的限制,但是在程序运行时,可以通过指针去修改访问被限制的变量。

sizeof(CPerson) = 12字节 (3个int型变量)

sizeof(CStudent) = Sizeof(CPerson)+4字节(m_StuID) = 16字节

三、继承中的访问控制

public     继承:父类成员在子类中保持原有访问级别

private    继承:父类成员在子类中变为private成员

protected继承:父类中public成员会变成protected

        父类中protected成员仍然为protected

                            父类中private成员仍然为private

派生类类成员访问级别设置的原则

如何恰当的使用publicprotectedprivate为成员声明访问级别?

1、需要被外界访问的成员直接设置为public

2、只能在当前类中访问的成员设置为private

3、只能在当前类和子类中访问的成员设置为protectedprotected成员的访问权限介于publicprivate之间。

三、派生类中的函数隐藏

函数隐藏:发生在基类和派生类中,函数完全相同时且基类没有虚函数。
或者函数只是同名,参数列表不同,无论是否有虚函数,都讲发生隐藏。

关于隐藏:在没有虚函数的情况下,发生函数隐藏。在编译的时候进行早期绑定,子类对象转换为父类对象后,用父类对象指针去调用的时候,我们还是调用父类的所在内存。因为子类对象所占内存的前半部分仍然是父类对象的内存。

原文地址:https://www.cnblogs.com/y4247464/p/13818324.html