继承和派生

继承:定义新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类)。

  • 派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。
  • 派生类一经定义后,可以独立使用,不依赖于基类。
  • 派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public。
  • 在派生类的各个成员函数中,不能访问基类中的private成员。

派生类的写法

Class 派生类名 : public 基类名

{

 

};

派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。

public继承的赋值兼容规则

1.派生类的对象可以赋值给基类对象,实质是成员变量的赋值。

2.派生类对象可以初始化基类引用

Base & br=d;

3.派生类对象的地址可以赋值给基类指针

Base *pb= &d;

Private 和protected以上不成立。

直接基类与间接基类

  • 在声明派生类时,只需要列出它的直接基类
  • 派生类沿着类的层次自动向上继承它的间接基类
  • 派生类的成员包括
    • 派生类自己定义的成员
    • 直接基类中的所有成员
    • 所有间接基类的全部成员

 

继承关系和复合关系

继承:“是”关系

  • 基类A,B是基类A的派生类
  • 逻辑上要求:“一个B对象也是一个A对象”。

复合:“有”关系

  • 类C中“有”成员变量K,K是类D的对象,则C和D是复合关系
  • 逻辑上要求:“D对象是C对象的固有属性或组成部分”。

 

 

派生类中成员与基类同名,可以通过作用域限定符区别。

访问范围说明:

基类的private成员:

  • 基类的成员函数
  • 基类的友元函数

基类的public成员:都可以访问

基类的protected成员:

  • 基类的成员函数
  • 基类的友元函数
  • 派生类的成员函数可以访问当前对象的基类的保护成员。

测试代码如下:

#include <iostream>
#include <string>

using namespace std;

class Student
{
private:
    string name;
    int age;
public:
    Student(string na, int a) :name(na), age(a) {};
    void printIfo()
    {
        cout << name<<",";
        cout << age<<endl;
    }
};
class graduteStudent : public Student
{
private:
    bool graduate;
public:
    graduteStudent(string name, int age) :Student(name, age) {};
    void printIfo()
    {
        Student::printIfo();
        cout << graduate << endl;
    }
    void SetInfor()
    {
        graduate = true;
    }
};
int main()
{
    Student s1("chen", 20);
    graduteStudent s2("Sonny",21);
    s2.SetInfor();
    s1.printIfo();
    s2.printIfo();
    s2.Student::printIfo();
    return 0;
}

 参考链接:

https://www.coursera.org/learn/cpp-chengxu-sheji

原文地址:https://www.cnblogs.com/helloforworld/p/5655277.html