五天速成C++-----第五天

文章详细介绍了C++中的面向对象编程概念,包括继承的原理和注意事项,如函数隐藏、构造和析构函数的调用顺序;权限的分类及其影响,以及如何通过作用域限定符访问隐藏成员;多态的实现、动态多态的条件和多态的注意事项,特别是虚函数的作用;还讨论了抽象类的概念和纯虚函数,以及异常处理的基本机制。
摘要由CSDN通过智能技术生成

面向对象核心

1.继承

定义:在已存在类的基础上,创建新的类。会拥有原有类的一些特性。通常会在原有类基础上做修改和增加操作。

已经存在的类成为父类或基类

新创建的类称为子类或派生类

#include <iostream>
using namespace std;
class Father{
public:
    string first_name="李";
    void work(){
        cout<<"我是名厨师"<<endl;
    }
};
class Son:public Father{ //公共继承

};
int main()
{
    Son s;
    cout<<s.first_name<<endl;
    s.work();
}

函数隐藏:如果子类中给出与父类同名的函数,父类中所有同名函数都被隐藏。如果需要访问需要父类的作用域限定符的方式进行访问

#include <iostream>
using namespace std;
class Father{
public:
    string first_name="王";
    void work(){
        cout<<"我是名厨师"<<endl;
    }
};
class Son:public Father{ //公共继承
public: //权限不写默认是私有的
    void work(){
        cout<<"工程师"<<endl;
    }
    void study(){
        cout<<"喜欢学习"<<endl;
    }
};
int main()
{
    Son s;
    cout<<s.first_name<<endl;
    s.work();
    s.Father::work();//可以访问被隐藏的父类函数
    s.study();
}



2.继承注意事项(掌握):

  1. 父类的构造函数不会继承下来
  2. 子类一定要直接或者间接的调用父类的构造函数。来完成从父类继承过来数据的初始化。如果子类不写明如何调用父类的构造函数,这时会调用父类无参的构造函数,如果父类中没有无参的构造函数,这时就会报错

子类构造函数直接调用父类构造函数

#include <iostream>
using namespace std;
class Father{
private:
    string name;
public:
    Father(string name){
        this->name=name;
    }
    void work(){
        cout<<name<<"是名厨师"<<endl;
    }
};
class Son:public Father{ //公共继承
public:
    //Son(string n):name(n){}  //错误:name是父类私有属性,子类不能直接访问
    Son(string n):Father(n){}

};
int main()
{
    Son s("小明");
    s.work();

}

3.权限(掌握)

注意:权限不写默认是私有

不同权限访问情况

不同权限的成员,在不同位置的可访问情况

public       本类中可以可以访问       在子类中可以访问     在全局中可以访问

protected 本类中可以可以访问       在子类中可以访问     在全局中不可以访问

private     本类中可以可以访问       在类中不可访问     在全局中不可以访问

#include <iostream>
using namespace std;
class Father{
    //只作为验证
public:
   string first_name="王";
protected:
   string car="宝马";
private:
   string password="123789";
public:
   void show(){
       cout<<first_name<<" "<<car<<" "<<password<<endl;
   }

};
class Son:public Father{
public:
    void show(){
        cout<<first_name<<endl;
        cout<<car<<endl;
        //cout<<password<<endl; //错误:父类私有成员子类不能直接访问
    }

};
int main()
{
    Father f;
    cout<<f.first_name<<endl;
    //cout<<f.car<<endl;         //保护权限全局中不可直接访问
    //cout<<f.password<<endl;    //私有权限全局中不可直接访问

}

不同权限的继承 (掌握)

  1. 任何权限的继承,私有权限成员继承之后,都不能直接访问
  2. 排除私有成员的情况下,公有继承全不变,保护继承变保护,私有继承变私有

私有继承时父类的私有成员 在子类中变成私有 应该是子类中不可直接访问

public继承(掌握)

公有继承使用最多

父类public权限成员

父类protected权限成员

父类私有权限成员

public继承后在子类中的情况

成为子类中public成员

成为子类中protected成员

能够继承下来,不能直接访问

#include <iostream>
using namespace std;
class Father{
public:
    string pubstr="pub";
protected:
    string prostr="pro";
private:
    string pristr="pri";
};
class Son:public Father{
public:
    void method(){
        cout<<pubstr<<endl;
        cout<<prostr<<endl;
        //cout<<pristr<<endl; //父类中私有的成员在子类中不能直接访问
    }

};
int main()
{
    Son s;
    s.method();
    cout<<s.pubstr<<endl;   //Father类中public成员在Son中也是public权限
    //cout<<s.prostr<<endl; //在子类中是保护权限

}

protected继承

父类public权限成员

父类protected权限成员

父类私有权限成员

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别睡了.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值