首页 技术 正文
技术 2022年11月14日
0 收藏 376 点赞 4,656 浏览 3035 个字

简单继承的例子:

 #include <iostream>
#include <string>
using namespace std; class CStudent
{
private:
string name;
string id; //学号
char gender; //性别,'F'代表女, 'M'代表男
int age;
public:
void PrintInfo();
void SetInfo( const string & name_,const string & id_,
int age_, char gender_ );
string GetName() { return name; }
}; void CStudent::PrintInfo()
{
cout << "Name:" << name << endl;
cout << "ID:" << id << endl;
cout << "Age:" << age << endl;
cout << "Gender:" << gender << endl;
} void CStudent::SetInfo( const string & name_,const string & id_,
int age_,char gender_ )
{
name = name_;
id = id_;
age = age_;
gender = gender_;
} class CUndergraduateStudent : public CStudent
{
//本科生类,继承了CStudent类
private:
string department; //学生所属的系的名称
public:
void QualifiedForBaoyan()
{
//给予保研资格
cout << “qualified for baoyan” << endl;
} void PrintInfo()
{
CStudent::PrintInfo(); //调用基类的PrintInfo
cout << “Department:” << department <<endl;
} void SetInfo( const string & name_,const string & id_,
int age_,char gender_ ,const string & department_)
{
CStudent::SetInfo(name_,id_,age_,gender_); //调用基类的SetInfo
department = department_;
}
}; int main()
{
CUndergraduateStudent s2;
s2.SetInfo(“Harry Potter ”, “”,,‘M’,“Computer Science”);
cout << s2.GetName() << “ ” ;
s2.QualifiedForBaoyan ();
s2.PrintInfo ();
return ;
}

类之间的两种关系
(1)继承:“是”关系。
基类 A, B是基类A的派生类。逻辑上要求:“一个B对象也是一个A对象”。
(2)复合:“有”关系。
类C中“有” 成员变量k, k是类D的对象,则C和D是复合关系,一般逻辑上要求:“ D对象是C对象的固有属性或组成部分”。

几何形体程序中,需要写“点”类,也需要写“圆”类

 class CPoint
{
double x,y;
}; class CCircle : public CPoint
{
double r;
};

这是不合理的,应该使用复合关系;每一个“圆”对象里都包含(有)一个“点”对象,这个“点”对象就是圆心

 class CPoint
{
double x,y;
//便于Ccirle类操作其圆心
friend class CCircle;
}; class CCircle
{
double r;
CPoint center;
};

覆盖
派生类可以定义一个和基类成员同名的成员,这叫覆盖。在派生类中访问这类成员时,缺省的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符号“::”

访问控制符

以下均表示可以被下列函数访问

1、基类的private成员:
(1)基类的成员函数
(2)基类的友员函数

2、基类的public成员:
(1)基类的成员函数
(2)基类的友员函数
(3)派生类的成员函数
(4)派生类的友员函数
(5)其他的函数

3、基类的protected成员:
(1)基类的成员函数
(2)基类的友员函数
(3)派生类的成员函数可以访问当前对象的基类的保护成员

 class Father
{
private:
int nPrivate; //私有成员
public:
int nPublic; //公有成员
protected:
int nProtected; // 保护成员
}; class Son : public Father
{
void AccessFather ()
{
nPublic = ; // ok;
nPrivate = ; // wrong
nProtected = ; // OK,访问从基类继承的protected成员
Son f;
f.nProtected = ; //wrong ,f不是当前对象
}
}; int main()
{
Father f;
Son s;
f.nPublic = ; // Ok
s.nPublic = ; // Ok
f.nProtected = ; // error
f.nPrivate = ; // error
s.nProtected = ; //error
s.nPrivate = ; // error
return ;
}

派生类的构造函数

在创建派生类的对象时,需要调用基类的构造函数:初始化派生类对象中从基类继承的成员。在执行一个派生类的构造函数之前,总是先执行基类的构造函数。

调用基类构造函数的两种方式
(1)显式方式:在派生类的构造函数中,为基类的构造函数提供参数.derived::derived(arg_derived-list):base(arg_base-list)
(2)隐式方式:在派生类的构造函数中,省略基类构造函数时,派生类的构造函数则自动调用基类的默认构造函数.

派生类的析构函数被执行时,执行完派生类的析构函数后,自动调用基类的析构函数。

在创建派生类的对象时:
(1)先执行基类的构造函数,用以初始化派生类对象中从基类继承的成员;
(2)再执行成员对象类的构造函数,用以初始化派生类对象中成员对象。
(3)最后执行派生类自己的构造函数

在派生类对象消亡时:
(1)先执行派生类自己的析构函数
(2)再依次执行各成员对象类的析构函数
(3)最后执行基类的析构函数
析构函数的调用顺序与构造函数的调用顺序相反。

赋值规则

(1)派生类的对象可以赋值给基类对象
b = d;
(2)派生类对象可以初始化基类引用
base & br = d;
(3)派生类对象的地址可以赋值给基类指针
base * pb = & d;
如果派生方式是 private或protected,则上述三条不可行。

公有派生的情况下,派生类对象的指针可以直接赋值给基类指针
Base * ptrBase = &objDerived;
(1)ptrBase指向的是一个Derived类的对象;
*ptrBase可以看作一个Base类的对象,访问它的public成员直接通过ptrBase即可,但不能通过ptrBase访问objDerived对象中属于Derived类而不属于Base类的成员
(2)即便基类指针指向的是一个派生类的对象,也不能通过基类指针访问基类没有,而派生类中有的成员。
(3)通过强制指针类型转换,可以把ptrBase转换成Derived类的指针
Base * ptrBase = &objDerived;
Derived *ptrDerived = (Derived * ) ptrBase;
要保证ptrBase指向的是一个Derived类的对象,否则很容易会出错。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,498
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,911
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,745
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,501
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,139
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,303