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++有更好的了解,我们务必掌握。另外如果上述有任何问题,请大家指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正。



