自学内容网 自学内容网

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)!