Fork me on GitHub

C++-继承篇


公有继承

1
class A:public B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Person
{
public:
void eat();
string m_strName;
int m_iAge;
};

class Worker:public Person
{
public:
void work();
int m_iSalary;
/*
隐含有继承过来的基类的属性与方法
void eat();
string m_strName;
int m_iAge;
*/
};

int main()
{
Worker worker;
worker.m_strName = "Merry"; // 可以使用继承过来的属性和方法
worker.eat();
}

protected在不涉及继承时和private是一样的,但涉及到继承的时候的时候,派生类可以访问基类的protected的成员和方法

基类成员访问属性 继承方式 派生类成员访问属性
private成员 无法访问
protected成员 public protected
public成员 public

通过共有继承,派生类不能访问从基类继承来的private私有成员,只能访问protected和public成员到对应的位置

保护继承

1
class A:protected B
基类成员访问属性 继承方式 派生类成员访问属性
private成员 无法访问
protected成员 protected protected
public成员 protected

私有继承

1
class A:private B
基类成员访问属性 继承方式 派生类成员访问属性
private成员 无法访问
protected成员 private private
public成员 private

隐藏

  • 父子关系
  • 成员同名
  • 隐藏
1
2
3
4
5
class A
{vold ABC();};

class B:public A
{void ABC();};

当实例化B对象时,B当中从A继承过来的ABC()函数被隐藏,B只能调用自身的ABC()函数
如果想调用父类的ABC()函数,可以通过A::ABC()来访问

Has a 和 Is a

Is a 关系:就是派生类也是父类的关系,比如隐形眼镜是眼镜,但眼镜不一定是隐形眼镜这种关系
也就是说可以把派生类赋值给父类

1
2
3
4
5
6
7
8
9
10
11
int main(void)
{
Soldier s1;
Person p1 = s1;
Person *p2 = &s1;

s1 = p1; // 错误
Soldier *s2 = &p1; // 错误

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void fun1(Person *p)
{
// to do
}

void fun2(Person &p)
{
// to do
}

int main(void)
{
Person p1;
Soldier s1;
fun1(&p1); fun2(p1);
fun1(&s1); fun2(s1);

return 0;
}
  • 将子类的对象赋值给父类对象,只会把子类与父类的共有成员进行赋值,其他成员会截断,丢失
  • 如果用父类的指针指向子类的对象,只能访问父类的成员

多重继承

1
2
3
4
5
6
7
8
9
class Person
{
};
class Soldier:public Person
{
};
class Infantryman:public Soldier
{
};

多继承

1
2
3
4
5
6
7
8
9
class Worker
{
};
class Farmer
{
};
class MigrantWorker:public Worker,public Farmer
{
};

若不写继承方式,默认是private继承方式

虚继承

多继承与多重继承带来的烦恼

![这里写图片描述](http://img.blog.csdn.net/20180210181500742?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHI0Njk3ODY3MDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

在菱形继承中,D类中会含有两个完全一样的A的数据,这是不能容忍的。

1
2
3
4
5
6
7
8
9
10
11
class Worker:virtual public Person
{
};

class Farmer:virtual public Person
{
};

class MigrantWorker:public Worker,public Farmer
{
};

那么MigrantWorker中只含有一份Person中的数据

坚持原创技术分享,您的支持将鼓励我继续创作
-------------本文结束感谢您的阅读-------------
0%