C++之继承
继承本质:继承别的类,父子关系
抽象公共方法,减少重复率,加强后续维护,增加健壮性
1.公有继承 class B:public A
A中属性继承到B中权限不变
2.保护继承 class B:protected A
class A中public属性变为protected属性
(即B从A中继承的所有属性均为protected)
3.私有继承 class B:private A
class A中public属性变为private属性
(即B从A中继承的所有属性均为private)
注意:所有继承均可访问原始类的公有属性和保护属性,只是权限不同,
但是所有继承都不可以访问private私有属性(私有被继承但是不能访问)
父类和子类的构造和析构顺序是谁先谁后?
继承中 先调用父类构造函数,再调用子类构造函数,
析构顺序与构造相反
父类与子类中有同名属性时(同名函数同理)
子类会覆盖父类同名属性的值,若需调用父类属性值,参考以下调用格式
静态才能通过类名访问:
多继承
//多继承容易产生成员同名的情况:A类和B类中内容重复or冲突
//通过使用类名作用域可以区分调用哪一个基类的成员
菱形继承问题(虚继承解决)
虚继承=抽象类
1. 羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。
2. 草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。
总结:
* 菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义
* 利用 虚继承 可以解决菱形继承问题
class Animal
{
public:
int m_Age;
};
//继承前加virtual关键字后,变为虚继承
//此时公共的父类Animal称为虚基类
class Sheep : virtual public Animal {};
class Tuo : virtual public Animal {};
class SheepTuo : public Sheep, public Tuo {};
void test01()
{
SheepTuo st;
st.Sheep::m_Age = 100;
st.Tuo::m_Age = 200;
cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;
cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << endl;
cout << "st.m_Age = " << st.m_Age << endl;
}
int main() {
test01();
system("pause");
return 0;
}
原文地址:https://blog.csdn.net/QoQ_____________/article/details/142390260
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!