【C++】浅谈三大特性之一继承(二)

三,继承方式&访问限定符

派生类可以继承基类中除了构造函数和析构函数之外的所有成员,但是这些成员的访问属性是由继承方式决定的。

不同的继承方式下基类成员在派生类中的访问属性:

举例说明:

(1)public继承

eg1:

#include <iostream>
using namespace std;

class Person
{
public://公有数据成员
	int length;//身高
	int weight;//体重
};

class Student:public Person
{
public:
	void test1()
	{
		length = 183;//子类中可访问父类的共有成员(包括属性和方法)
		weight = 70;
		total = 300;
	}
private:
	int total;//总分
	char* school;//学校
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象可访问基类的公有成员(包括属性和方法)
	s1.weight = 45;
}
int main()
{
	Funtest();
	return 0;
}

由上述例子可得出:公有继承中,派生类中可访问基类的公有成员(包括属性和方法),类外派生类的对象可访问基类的公有成员(包括属性和方法)

eg2:

#include <iostream>
using namespace std;

class Person
{
protected://保护数据成员
	int length;//身高
	int weight;//体重
};

class Student:public Person
{
public:
	void test1()
	{
		length = 183;//子类中可访问父类的保护成员(包括属性和方法)
		weight = 70;
		total = 300;
	}
private:
	int total;//总分
	char* school;//学校
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可访问基类的保护成员(包括属性和方法)
	s1.weight = 45;
}
int main()
{
	Funtest();
	return 0;
}

编译结果:

由上述例子可得出:公有继承中,派生类中可访问基类的保护成员(包括属性和方法),类外派生类的对象不可以访问基类的保护成员(包括属性和方法)

eg3:

#include <iostream>
using namespace std;
class Person
{
	private://私有数据成员
	int length;//身高
};

class Student:public Person
{
public:
	void test1()
	{
		length = 183;//子类中不可以访问父类的私有成员(包括属性和方法)
	}
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可以访问基类的私有成员(包括属性和方法)
}
int main()
{
	Funtest();
	return 0;
}

编译结果:

由上述例子可得出:公有继承中,派生类中不可以访问基类的私有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

(二)保护继承

eg1:

#include <iostream>
using namespace std;

class Person
{
	public://公有数据成员
	int length;//身高
};

class Student:protected Person
{
public:
	void test1()
	{
		length = 183;//子类中可以访问父类的公有私有成员(包括属性和方法)
	}
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可以访问基类的公有成员(包括属性和方法)
}
int main()
{
	Funtest();
	return 0;
}

编译结果:

结论:保护继承中,派生类中可以访问基类的公有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

eg2:

#include <iostream>
using namespace std;

class Person
{
	protected://保护数据成员
	int length;//身高
};

class Student:protected Person
{
public:
	void test1()
	{
		length = 183;//子类中可以访问父类的保护成员(包括属性和方法)
	}
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可以访问基类的保护成员(包括属性和方法)
}
int main()
{
	Funtest();
	return 0;
}

编译结果:

结论:保护继承中,派生类中可以访问基类的保护成员(包括属性和方法),类外派生类的对象不可以访问基类的保护成员(包括属性和方法)

eg3:

#include <iostream>
using namespace std;

class Person
{
	private://私有数据成员
	int length;//身高
};

class Student:protected Person
{
public:
	void test1()
	{
		length = 183;//子类中可以访问父类的私有成员(包括属性和方法)
	}
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可以访问基类的私有成员(包括属性和方法)
}
int main()
{
	Funtest();
	return 0;
}

编译结果:

结论:保护继承中,派生类中不可以访问基类的私有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

(三)私有继承

eg1:

#include <iostream>
using namespace std;

class Person
{
	public://公有数据成员
	int length;//身高
};

class Student:private Person
{
public:
	void test1()
	{
		length = 183;//子类中可以访问父类的公有成员(包括属性和方法)
	}
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可以访问基类的公有成员(包括属性和方法)
}
int main()
{
	Funtest();
	return 0;
}

运行结果:

结论:私有继承中,派生类中可以访问基类的公有成员(包括属性和方法),类外派生类的对象不可以访问基类的公有成员(包括属性和方法)

eg2:

#include <iostream>
using namespace std;

class Person
{
	protected://保护数据成员
	int length;//身高
};

class Student:private Person
{
public:
	void test1()
	{
		length = 183;//子类中可以访问父类的保护成员(包括属性和方法)
	}
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可以访问基类的保护成员(包括属性和方法)
}
int main()
{
	Funtest();
	return 0;
}

运行结果:

结论:私有继承中,派生类中可以访问基类的保护成员(包括属性和方法),类外派生类的对象不可以访问基类的保护成员(包括属性和方法)

eg3:

#include <iostream>
using namespace std;

class Person
{
	private://私有数据成员
	int length;//身高
};

class Student:private Person
{
public:
	void test1()
	{
		length = 183;//子类中不可以访问父类的私有成员(包括属性和方法)
	}
};

void Funtest()
{
	Student s1;
	s1.length = 160;//类外派生类的对象不可以访问基类的私有成员(包括属性和方法)
}
int main()
{
	Funtest();
	return 0;
}

运行结果:

结论:私有继承中,派生类中不可以访问基类的私有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

总结:

三种继承方式下,在派生类中均可访问基类的共有成员和保护成员,私有成员不能访问(因为基类和派生类不属于同一作用域).

公有继承中, 在类外通过子类的对象可访问基类的公有成员(包括成员数据和成员函数),其他情况在类外均访问不了。

保护继承中,派生类中基类的public成员降级为protected,protected降级为private。

私有继承中,派生类中基类的public成员降级为private,protected降级为private。

派生类继承了除基类的构造函数和析构函数之外的所有成员,稍后讲解。

public继承是一个接口继承,保持is-a原则。每个父类可用的成员对子类都可用,每个子类成员都可看做一个父类成员。

private和protected是实现继承,保持has-a原则。类似一组合/聚合。但它比组合更低级,当一个派生类对象需要访问基类的保护成员或需要重新定义虚函数时它就是合理的,绝大多数情况下我们都会选择public继承。

(未完待续....)

时间: 2024-10-09 20:15:32

【C++】浅谈三大特性之一继承(二)的相关文章

【C++】浅谈三大特性之一继承(一)

一,为什么要引入继承? 继承是一个非常自然的概念,现实世界中的许多事物也都是具有继承性的. 例如,爸爸继承爷爷的特性,儿子又继承爸爸的特性等都属于继承的范畴.下面是一个简单的汽车分类图: 在这个分类图中建立了一种层次结构,最高层是最普遍,最一般的,每一次都比它上一层的更详细,更具体. 其中把上一层的叫做基类(或父类),紧接着基类的下一层叫做派生类(或子类). 所谓继承,就是从先辈处得到属性和特征. 类的继承就是新类从已有类得到已有的特性,新类被称为派生类,已有类被称为基类.可抽象为派生类是基类的

【C++】浅谈三大特性之一继承(三)

四,派生类的六个默认成员函数 在继承关系里,如果我们没有显示的定义这六个成员函数,则编译系统会在适合场合为我们自动合成. 继承关系中构造函数和析构函数的调用顺序: class B { public: B() { cout<<"B()"<<endl; } ~B() { cout<<"~B()"<<endl; } }; class D:public B { public: D() { cout<<"D

【转】java提高篇(二)-----理解java的三大特性之继承

[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句话中最引人注目的是"复用代码",尽可能的复用代码使我们程序员一直在追求的,现在我来介绍一种复用代码的方式,也是java三大

java基础篇(二) ----- java面向对象的三大特性之继承

java面向对象的三大特性之继承: 复用代码是java众多引人注目的功能之一,但是想要成为极具革命性的语言,仅仅是复制代码并对其加以改变是不够的.它必须能够做更多的事.引自<Think in java>    而代码复用也是程序员一直不断追求的.由此来说下代码复用的一种方式 java面向对象的三大特性--继承!! 在面向对象程序设计中,继承机制可以有效地组织类的结构.确定类之间的关系,在已有类的基础上开发新的类.继承机制在程序代码复用.提高软件开发效率.降低软件系统维护成本等方面具有重要作用.

java随笔:三大特性之继承

Java三大特性之继承 一.介绍 笔记重点:构造器.protected关键字(这个自行查阅).向上转型.private关键字(继承非常重要的要点)  复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句话中最引人注目的是"复用代码",尽可能的复用代码使我们程序员一直在追求的. 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继

Python面向对象之:三大特性:继承,封装,多态。

前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到?个对象中. 把固定功能的代码封装到?个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了?个很?B的函数. 那这个也可以被称为封装. 在?向对象思想中. 是把?些看似?关紧要的内容组合到?起统?进?存储和使?. 这就是封装. 2. 继承: ?类可以?动拥有?类中除了私有属性外的其他所有内容. 说?了, ??可以随便?爹的东?. 但是朋友们, ?定要认清楚?个

19.Python面向对象之:三大特性:继承,封装,多态。

前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到?个对象中. 把固定功能的代码封装到?个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了?个很?B的函数. 那这个也可以被称为封装. 在?向对象思想中. 是把?些看似?关紧要 的内容组合到?起统?进?存储和使?. 这就是封装. 2. 继承: ?类可以?动拥有?类中除了私有属性外的其他所有内容. 说?了, ??可以随便?爹的东?. 但是朋友们, ?定要认 清楚

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

面向对象的三大特性之继承-基础知识总结------彭记(05)

面向对象的三大特性之继承: js中的某些对象没有一些需要的属性和方法,但是另外的对象有,那么拿过使用,就是继承. js中继承的实现方式: 1.混入式继承:通过循环将一个对象中的所有属性和方法混入到另外一个对象中: var me={ work:function(){ console.log('敲代码'): } }: var mayun={ money:9999999, car:'000', manager:function(){ console.log('管理巴巴...'); } } /*遍历,让