C++之继承与派生(1)

C++之继承与派生(1)

http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/08/2130817.html

继承是面向对象程序设计中的重要特性,是软件复用的一种形式。其实继承和派生就是同一种概念的不同说法罢了,通常我们说子类继承父类,父类派生出子类。说实话,学习和了解了C++的继承与派生后,发现我对面向对象中的继承与派生有了更深刻的理解。在更加深入了解C++关于继承方面的知识之前,我想先讲一下C++中派生与继承的基本概念,它是之后学习派生类的构造与析构,以及多重继承等的基础。

  1.派生类的声明

  声明一个派生类的一般格式:

  class 派生类名:[继承方式] 基类名

  {

     派生类新增的数据成员和成员函数

  };

  对于上述的格式主要想说一下继承方式的作用,它主要是规定如何访问从基类继承的成员。它可以有关键字private、protected和public来分别表示私有继承、保护继承和公有继承。如果不显示继承方式关键字,系统默认为私有继承。继承方式指定类派生类成员以及类外对象对于从基类继承来的成员的访问权限。

  2.对于不同的继承方式,基类成员在派生类中的访问属性也是不同的,以下表,列出了基类成员在派生类中的访问属性(我想以一张表格的方式来说明,既显而易见,又简单易懂):

  3.最后说一下,派生类对基类成员的访问规则,无非访问方式就两种:内部访问和对象访问。同样的3中继承方式下,派生类对基类成员的访问也分为3类。对于3种访问规则,我将用实例和小结一一对应:

(1).私有继承的访问规则:

示例:

#include "stdafx.h"
#include <iostream>

class A
{
private:
int a1;
protected:
int a2;
public:
int a3;
A(int a1);
void showA();
};

A::A(int a1)
{
this->a1=a1;
}
void A::showA()
{
std::cout<<"a1="<<this->a1<<std::endl;
}

class B:private A
{
private:
int b;
public:
B(int b,int a1,int a2,int a3);
void showB();
};

B::B(int b,int a1,int a2,int a3):A(a1)
{
this->a2=a2;//内部可以访问
this->a3=a3;//内部可以访问
this->b=b;
}

void B::showB()
{
//std::cout<<"a1="<<this->a1<<std::endl;不可访问
showA();//间接访问
std::cout<<"a2="<<this->a2<<std::endl;
std::cout<<"a3="<<this->a3<<std::endl;
std::cout<<"b="<<this->b<<std::endl;
}

int main()
{
B b(4,1,2,3);
//b.a1=5;//类外不可访问
//b.a3=5;类外不可访问
//b.a2=5;类外不可访问
//b.showA();类外不可访问
b.showB();

return0;
}

结果:

由以上示例可小结:

私有继承那么派生类继承下来的基类中的成员,在派生类中就都成为了私有成员,因此,派生类的对象访问任何基类中的成员(数据成员a1,a2,a3和成员函数showA())都不允许,而派生类内部不可访问基类中的私有成员(a1),可访问保护成员(a2)和公有成员(数据成员a3,成员函数showA());

(2).保护继承的访问规则:

对上述示例代码中的private继承换为protected

#include <iostream> 3  4 class A 5 { 6 private: 7 int a1; 8 protected: 9 int a2;10 public:11 int a3;12         A(int a1);13 void showA();14 };15 16 A::A(int a1)17 {18 this->a1=a1;19 }20 void A::showA()21 {22     std::cout<<"a1="<<this->a1<<std::endl;23 }24 25 26 class B:protected A //保护继承27 {28 private:29 int b;30 public:31         B(int b,int a1,int a2,int a3);32 void showB();33 };34 35 B::B(int b,int a1,int a2,int a3):A(a1)36 {37 this->a2=a2;//内部可以访问38 this->a3=a3;//内部可以访问39 this->b=b;40 }41 42 void B::showB()43 {44 //std::cout<<"a1="<<this->a1<<std::endl;不可访问45     showA();//间接访问46     std::cout<<"a2="<<this->a2<<std::endl;47     std::cout<<"a3="<<this->a3<<std::endl;48     std::cout<<"b="<<this->b<<std::endl;49 }50 51 52 int main()53 {54     B b(4,1,2,3);55 //b.a1=5;//类外不可访问56 //b.a3=5;类外不可访问57 //b.a2=5;类外不可访问58 //b.showA();类外不可访问59     b.showB();60 61 return0;62 }

由以上示例可小结(运行结果和上一示例相同):

保护继承那么派生类继承下来的基类中的成员,除了私有的基类成员不变外,在派生类中就都成为了保护成员,因此,派生类内部不可访问基类中的私有成员(a1),可访问保护成员(a2)和公有成员(数据成员a3,成员函数showA());而派生类的对象访问任何基类中的成员(数据成员a1,a2,a3和成员函数showA())都不允许,a1是私有成员,不能访问,但a2,a3和showA()被继承下来在派生类中是保护成员,它们不能访问是因为protected保护类型的成员可以被本类的成员函数访问,也可以被继承被类的的派生类成员函数访问,但类以外的任何访问都不允许,即它为半隐蔽的。

(3).公有继承的访问规则:

示例:

#include <iostream>

class A
{
private:
int a1;
protected:
int a2;
public:
int a3;
A(int a1);
void showA();
};

A::A(int a1)
{
this->a1=a1;
}
void A::showA()
{
std::cout<<"a1="<<this->a1<<std::endl;
}

class B:public A //公有继承
{
private:
int b;
public:
B(int b,int a1,int a2,int a3);
void showB();
};

B::B(int b,int a1,int a2,int a3):A(a1)
{
this->a2=a2;//内部可以访问
this->a3=a3;//内部可以访问
this->b=b;
}

void B::showB()
{
//std::cout<<"a1="<<this->a1<<std::endl;不可访问
//showA();//间接访问
std::cout<<"a2="<<this->a2<<std::endl;
std::cout<<"a3="<<this->a3<<std::endl;
std::cout<<"b="<<this->b<<std::endl;
}

int main()
{
B b(4,1,2,3);
//b.a1=5;//类外不可访问
//b.a2=5;类外不可访问
b.a3=5;
b.showA();
b.showB();

return0;
}

结果:

由以上示例可小结:

公有继承那么派生类继承下来的基类中的成员,除了私有的基类成员和保护的基类成员不变外,在派生类中就都成为了公有成员,因此,派生类内部不可访问基类中的私有成员(a1),可访问保护成员(a2)和公有成员(数据成员a3,成员函数showA());而派生类的对象可以访问基类中数据成员a3和成员函数showA(),但不允许访问私有成员a1和保护成员a2。

  4.最后总结一下,其实这节所讲的内容归根到底就是对于继承方式的理解,以及从继承方式所引出的访问属性和规则的相对应的不同区别。因为觉得直接用文字来表达,看起来会比较乱,所以试着参入表格和示例小结来说明。希望这样能达到读者在看这篇随笔时不会觉得思绪很混乱!

时间: 2024-10-10 16:56:23

C++之继承与派生(1)的相关文章

程序设计实习MOOC / 继承和派生——编程作业 第五周程序填空题1

描述 写一个MyString 类,使得下面程序的输出结果是: 1. abcd-efgh-abcd- 2. abcd- 3. 4. abcd-efgh- 5. efgh- 6. c 7. abcd- 8. ijAl- 9. ijAl-mnop 10. qrst-abcd- 11. abcd-qrst-abcd- uvw xyz about big me take abcd qrst-abcd- 要 求:MyString类必须是从C++的标准类string类派生而来.提示1:如果将程序中所有 "My

C++继承与派生

2017-06-25 23:00:59 c++中的继承和派生是面向对象编程中的一个重要内容,通过继承可以实现代码的复用,同时继承也是实现多态性的基础. 一.c++继承的基本形式 class 派生类名:继承方式 基类名,继承方式 基类名 {}: 继承方式主要有三种,public ,private ,protected. 缺省条件下是private继承,三种中public继承用的最多,不同的继承方式决定了子类中从基类继承过来的成员的访问属性. public继承: 基类的public,protecte

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

模块的封装之C语言类的继承和派生

[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我们将 在此的基础上介绍C语言类的继承和派生.其实继承和派生是一个动作的两种不同角度的表达 .当我们继承了一个基类而创造了一个新类时,派生的概念就诞生了.派生当然是从基类派生的.派生出来的类当然是继承了基类的 东西.继承和派生不是一对好基友,他们根本就是一个动作的两种不同的说法,强调动作的起始点的时候

3.继承与派生

1.类的继承与派生 - 类的继承:从已有类产生新类的过程.原有类称为基类或父类,产生的新类称为派生类或子类. - 派生类语法: class 派生类名:继承方式   基类名1,继承方式 基类名2,... { } - 单继承和多继承:基类个数决定 - 直接基类,间接基类 - 继承方式规定了如何访问从基类继承的成员 - 派生类成员是指除了从基类继承的所有成员之外,新增加的数据和函数成员 - 派生类生成过程:吸收基类成员->改造基类成员->添加新的成员,构造函数和析构函数都不被继承 2.访问控制 -

嵌入式linux C++语言(七)——继承与派生

嵌入式linux C++语言(七)--继承与派生 一.继承 在C++编程中软件可重用性(software reusability)是通过继承(inheritance)机制来实现的.类的继承,是新的类从已有类那里得到已有的特性.或从已有类产生新类的过程就是类的派生.原有的类称为基类或父类,产生的新类称为派生类或子类. 派生类的声明:class 派生类名:[继承方式] 基类名{派生类成员声明:};    一个派生类可以同时有多个基类,这种情况称为多重继承,派生类只有一个基类,称为单继承. 继承方式规

继承与派生,重载&lt;&lt;

///继承与派生 #include <iostream> using namespace std; class Point { public: Point (float a=0,float b=0):x(a),y(b) {} ///有默认参数的构造函数 void setPoint (float,float); ///重新设置坐标 ///读x的坐标,getX为常成员函数,只能访问类的数据,而不能更改 float getX() const { return x; } float getY() co

c++学习--继承与派生

继承和派生 1 含有对象成员(子对象)的派生类的构造函数,定义派生类对象成员时,构造函数的执行顺序如下: 1 调用基类的构造函数,对基类数据成员初始化: 2 调用对象成员的构造函数,对对象成员的数据成员初始化: 3 执行派生类的构造函数体,对派生类数据成员初始化. 代码如下:#include<iostream.h> class base{ int x; public: base(int i) { x=i; cout<<"基类的构造函数"<<endl;

面向对象(二)——继承、派生、组合以及接口

一.继承与派生 1.1 什么是继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 Python中类的继承分为:单继承和多继承 class People: # 定义父类 def __init__(self,name,age): self.name=name self.age=age def walk(self): print('%s is walking' %self) class Teacher(People): #

C++学习笔记44:继承与派生

类的组合,类的继承 类的组合(汽车类,轮子类,此时可以把轮子类组合到汽车类:) 类的继承(交通工具类,汽车类,此时汽车类可以派生自交通工具类:) 组合:常用描述has a.. 继承:常用描述is a .. 如果既可以用组合又可以用派生解决,那首选组合方式: 继承与派生的目的 继承的目的:实现设计和代码的重用 派生的目的:当新的问题出现,原有程序无法解决,需要对原有的程序进行改造 派生类的构成 吸收基类的成员 改造基类的成员 添加新的成员 吸收基类的成员 默认情况下派生类包含了全部的基类中除了构造