类和对象---继承

继承,是面向对象三大特性之一

继承的基本语法

#include<iostream>
#include<cstring>
using namespace std;
class BasePage
{
public:
    void header()
    {
        cout << "首页,公开课,登录,注册..." << endl;
    }
    void footer()
    {
        cout << "帮助中心,交流合作,站内地图..." << endl;
    }
    void left()
    {
        cout << "Java,python,c++..." << endl;
    }
    void content()
    {
        cout << "Java学科视频" << endl;
    }
};
//Java页面
class Java :public BasePage  //核心语句
{
public:
    void content()
    {
        cout << "Java学科视频" << endl;
    }
};
//C++页面
class CPP :public BasePage    //核心语句
{
public:
    void content()
    {
        cout << "CPP学科视频" << endl;
    }
};
void test01()
{
    Java ja;
    ja.header();
    ja.footer();
    ja.left();
    ja.content();

    CPP cpp;
    cpp.header();
    cpp.footer();
    cpp.left();
    cpp.content();
}
int main()
{
    test01();
	return 0;
}

继承的好处:减少重复代码
语法: class 子类: 继承方式 父类
子类 也称为 派生类
父类 也称为 基类
派生类的成员,包含两大部分:一类是从基类继承过来的,一类是自己增加的成员.

继承方式

相同点:三种继承访问均不可以访问父类中的私有成员

  1. 公共继承
    父类中的公共成员继承为自身公共成员,父类中的保护成员继承为自身保护成员
  2. 保护继承
    父类中的公共成员和保护成员继承为自身保护成员
  3. 私有继承
    父类中的公共成员和保护成员继承为自身私有成员

继承中的对象模型

父类中所有非静态成员属性都会被子类继承下去
父类中私有成员属性是被编译器给隐藏了,因此是访问不到,但确实被继承了

继承中的构造和析构顺序

子类继承父类后,当创建子类对象,也会调用父类的构造函数和析构函数
顺序是 父类构造—子类构造—子类析构—父类析构

继承同名成员处理方式

问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或者父类中同名的数据

  • 访问子类同名成员 直接访问即可
  • 访问父类同名成员 需要加作用域(.Base:😃
    如何调用父类中同名成员函数
    如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
    如果想访问父类中被隐藏的同名成员函数,需要加作用域

多继承语法(不建议实际开发使用)

C++允许一个类继承多个类
语法:class :子类 继承方式,子类 继承方式
当父类中出现同名成员,需要加作用域区分(.Basex:😃

菱形继承(钻石继承)

概念:两个派生类继承同一个基类,又有某个类同时继承两个派生类

#include<iostream>
#include<cstring>
using namespace std;
//利用虚继承可以解决菱形继承的问题
//继承前加上关键字virtual变为虚继承
//Animal类称为 虚基类
class Animal
{
public:
	int m_age;
};
class Sheep :virtual public Animal 
{

};
class Tuo :virtual public Animal
{

};
class SheepTuo :public Sheep, public Tuo
{

};
void test01()
{
	SheepTuo st;
	//当菱形继承,;两个父类拥有相同的数据,需要加以作用域区分
	st.Tuo::m_age = 28;
	st.Sheep::m_age = 18;
	cout << st.Tuo::m_age << st.Sheep::m_age << endl;
}
int main()
{
	test01();
	return 0;
	
}

总结:菱形继承会造成子类继承两份相同数据,造成资源浪费,须使用虚继承解决

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值