知识点1【继承】

继承描述的是类和类的关系,如果A类继承于B类,那么A类就拥有B的数据和方法,同时A类可以新增自己的数据和方法。

继承_父类

1、继承的语法

class 子类名:继承方式(public protected private) 父类名
{
    //新增的数据和方法
}

不管任何继承方式 父类私有数据 在子类中 不可见

继承_子类_02

(不管任何继承方式 父类私有数据 在子类中 不可见)公共继承保持不变,保护继承变保护,私有继承变私有。

2、继承中的构造和析构顺序

继承_父类_03

3、如果要调用父类以及对象成员的有参构造 必须使用初始化列表。

Son(int a, int b, int c):Base(a),ob(b),c(c)
{
    cout<<"Son有参参构造函数"<<endl;
}

子类 默认会调用父类以及对象成员无参构造。

注意:在使用初始化列表时,调用父类的有参构造需要父类名,调用对象成员的有参构造 用对象名

4、如果父类和子类有同名 (加作用域 简单-有效)

4.1 父类和子类的数据 同名

子类对象 优先调用子类自身的同名成员。

子类对象 访问父类同名成员 加父类作用域。

class Base
{
public:
    int a;
    Base(int a)
    {
        this->a = a;
        cout<<"Base有参构造函数 a="<<a<<endl;
    }
};
class Son:public Base
{
public:
    int a;
    Son(int a, int b):Base(a),a(b)
    {
        cout<<"Son有参参构造函数"<<endl;
    }
};
void test01()
{
    Son ob1(10,20);
    cout<<ob1.a<<endl;//优先访问子类的a 10
    cout<<ob1.Base::a<<endl;//强制访问父类的a 20
}

4.2 父类和子类的函数 同名

一旦子类 重新定义 父类的同名函数(只要函数名相同即可),子类都屏蔽父类所有的同名函数。(但是 可以加父类作用域 访问父类的同名函数)。

class Base
{
public:
    void func(void)
    {
        cout<<"父类的func void"<<endl;
    }
    void func(int a, int b)
    {
        cout<<"父类的func int int "<<endl;
    }
    void func(int a, int b,int c)
    {
        cout<<"父类的func int int int "<<endl;
    }
};
class Son:public Base
{
public:
    void func(void)
    {
        cout<<"子类的func void"<<endl;
    }
};
void test01()
{
    Son ob1;
    ob1.func();
    ob1.Base::func();
    ob1.Base::func(10,20);
    ob1.Base::func(10,20,30);
}

继承_子类_04

5、重载、重定义的区别(记)

重载没有继承,同一作用域 函数名相同 参数的个数、顺序、类型不同 返回值类型不能作为重载条件。

重定义继承,子类重新定义父类的同名函数。(只要函数名相同即可)

6、子类无法继承父类的方法(

子类 无法继承 父类的构造、析构、operator=。