欢迎光临
我们一直在努力

C++继承

C++继承

目录

1. 前言
2. 继承知识
3. 相关问题
3.1 继承同名成员处理方式
3.2 多继承语法
3.3 菱形继承
4. 总结
1. 前言

继承是面向对象三大特性之一 在这里插入图片描述

我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码

2. 继承知识

2.1语法:class 子类: 继承方式 父类

2.2

  • 子类也称为派生类

  • 父类也称为基类

2.3 继承方式一共有三种:

  • 公共继承
  • 保护继承
  • 私有继承 如下图: 在这里插入图片描述
3. 相关问题
3.1 继承同名成员处理方式

通过对象来调用类里面的对象,小编在之前的文章有讲过,如下:

Son s;
cout << s.m_A << endl;//调用的是子类对象的成员属性

但是当我使用继承,并且父类与子类的成员属性名字相同,该怎么去区分调用呢?

答案是:我们得去加上作用域 代码如下:

#include<iostream>
using namespace std;

class Base
{
public:
Base()
{
m_A = 100;
}
int m_A;
};
class Son:public Base
{
public:
Son()
{
m_A = 200;
}
int m_A;
};
void test()
{
Son s;
cout << s.m_A << endl;//调用的是子类对象的成员属性
//cout << s.Son::m_A << endl;

//那么想要调用父类的成员属性怎么办? 需要添加作用域
cout << s.Base::m_A << endl;
}
//如果是同名成员函数依旧如此
int main()
{
test();
system("pause");
return 0;
}

举一反三

  • 对于继承中出现同名成员函数依旧如此处理

  • 对于静态成员变量和静态成员函数依旧如此处理(变量或函数前加上关键字static) 注意点1:静态成员对象必须类内声明,类外初始化

class Person
{
public:
static int m_A;
};
int Person::m_A = 100;

因此多了一种调用方式,通过类名访问 cout<<Person::m_A<<endl;

3.2 多继承语法

多继承可能会引发父类中有同名成员出现,需要加作用域区分

C++实际开发中不建议用多继承,了解即可

代码如下:

#include<iostream>
using namespace std;

class Base
{
public:
Base()
{
m_A = 100;
}
int m_A;
};

class Base2
{
public:
Base2()
{
m_A = 200;
}
int m_A;
};
class Son:public Base, public Base2
{
public:
Son()
{
m_C = 200;
}
int m_C;
};
void test()
{
Son s;
cout << s.Base::m_A << endl;
//当父类中出现同名成员,需要加作用域区分
cout << s.Base2::m_A << endl;
}
//如果是同名成员函数依旧如此
int main()
{
test();
system("pause");
return 0;
}

3.3 菱形继承

菱形继承概念:

两个派生类继承同一个基类 又有某个类同时继承者两个派生类 这种继承被称为菱形继承,或者钻石继承

如下图: 在这里插入图片描述 代码如下:

#include<iostream>
using namespace std;

class Animal
{
public:
int m_Age;
};
class Sheep : public Animal
{

};
class Tuo : public Animal
{

};
class SheepTuo :public Sheep, public Tuo
{

};//其他的类不能自己写m_Age

void test()
{
SheepTuo st;
st.Sheep::m_Age = 18;
st.Tuo::m_Age = 28;
cout << "Sheep的年龄为:" << st.Sheep::m_Age << endl;//18
cout << "Tuo的年龄为:" << st.Tuo::m_Age << endl;//28
}
int main()
{
test();
system("pause");
return 0;
}

但是问题在于,SheepTuo的数据不管是继承谁的,我们都只需要一份。那么存储Sheep和Tuo的两份数据那就是浪费空间

因此我们需要利用虚继承解决菱形继承的问题

继承之前加上关键字virtual变为虚继承

Anima1类称为虚基类

#include<iostream>
using namespace std;

class Animal
{
public:
int m_Age;
};
class Sheep :virtual public Animal
{

};
class Tuo :virtual public Animal
{

};
class SheepTuo :public Sheep, public Tuo
{

};//其他的类不能自己写m_Age

void test()
{
SheepTuo st;
st.Sheep::m_Age = 18;
st.Tuo::m_Age = 28;
cout << "Sheep的年龄为:" << st.Sheep::m_Age << endl;//28
cout << "Tuo的年龄为:" << st.Tuo::m_Age << endl;//数据变为了一份,已经变化为28
}
int main()
{
test();
system("pause");
return 0;
}

4. 总结

以上就是今天要讲的内容,继承是面向对象三大特性之一,比较重要,但也为我们以后学习C++有更好的了解,我们务必掌握。另外如果上述有任何问题,请大家指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正。

赞(0)
未经允许不得转载:171主机测评 » C++继承
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址