新标准C++程序设计读书笔记_继承和多态
简单继承的例子:
#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类的对象,否则很容易会出错。
新标准C++程序设计读书笔记_继承和多态的更多相关文章
- 新标准C++程序设计读书笔记_类和对象
面向对象的程序设计方法 抽象:将某类客观事物共同特点(属性)归纳出来,形成一个数据结构(可以用多个变量描述事物的属性):将这类事物所能进行的行为也归纳出来,形成一个个函数,这些函数可以用来操作数据结构 ...
- 新标准C++程序设计读书笔记_运算符重载
形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 class Complex { publ ...
- C# 读书笔记之继承与多态
1.1继承与多态的基本概念 1.1.1 继承和多态 继承是面向对象程序设计的主要特征之一,允许重用现有类(基类,亦称超类.父类)去创建新类(子类,亦称派生类)的过程.子类将获取基类的所有非私有数据和行 ...
- 多态的作用-游戏编程展示------新标准c++程序设计
游戏软件的开发最能体现面向对象设计方法的优势.游戏中的人物.道具.建筑物.场景等都是很直观的对象,游戏运行的过程就是这些对象相互作用的过程.每个对象都有自己的属性和方法,不同对象也可能有共同的属性和方 ...
- 类与类之间的两种关系------新标准c++程序设计
在c++中,类和类之间有两种基本关系:复合关系和继承关系. 复合关系也称为“has a”关系或“有”的关系,表现为封闭类,即一个类以另一个类的对象作为成员变量. 继承关系也称为“is a”关系或“是” ...
- 正确处理类的复合关系------新标准c++程序设计
假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类.狗是有主人的,主人也有狗.假定狗只有一个主人,但一个主人可以有最多10条狗.该如何处理“主人”类和“狗”类的关系呢?下面是 ...
- 在成员函数中调用虚函数(关于多态的注意事项)------新标准c++程序设计
类的成员函数之间可以互相调用.在成员函数(静态成员函数.构造函数和析构函数除外)中调用其他虚成员函数的语句是多态的.例如: #include<iostream> using namespa ...
- 多态实现的原理------新标准c++程序设计
“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定.例子: #include<iostream> using namespac ...
- 复制构造函数被调用的三种情况------新标准c++程序设计
1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...
随机推荐
- PTC问答
1.什么是PTC点击网站? 答:PTC点击网站是一类网赚网站,通过点击广告来获取收益.当然,单纯通过点击广告获取的收益很少,甚至可以说可以忽略不计.如果单干不推广的话主要通过投资租赁下线来获得收益. ...
- [Android Pro] ListView,GridView之LayoutAnimation特殊动画的实现
转载自:http://gundumw100.iteye.com/blog/1874545 LayoutAnimation干嘛用的?不知道的话网上搜一下. Android的Animation之Layou ...
- 十二.spring-boot使用spring-boot-freemarker
①.在springMVC中:它代表着view层组件 ②.为什么使用freemarker:简单容易学.逻辑分明 ③.freemarker优点:它不依赖servlet.网络或者web环境 一.创建一个ma ...
- dl,dt,dd标记在网页中要充分利用
dl,dt,dd标记在网页中要充分利用 来源:网络整理 时间:08-05-27 点击: 点击这里收藏本文 我们在制作网页过程中用到列表时一般会使用<ul>或者<ol>标签,很少 ...
- SQL盲注测试高级技巧
写在前面: 这篇文章主要写了一些加快盲注速度的技巧和盲注中比较精巧的语句,虽然注入并不是什么新技术了.但是数据库注入漏洞依然困扰着每一个安全厂商,也鞭策着每一个安全从业者不断前进. 正文: 首先来简单 ...
- AI 语音对话技术
机器学习以及自然语言处理技术的进步,开启了人与人工智能进行语音交互的可能,人们透过对话的方式获取信息.与机器进行交互,将不再只是存在科幻情结当中.语音交互是未来的方向,而智能音箱则是语音交互落地的第一 ...
- java发送http的get和post请求
import java.io.*; import java.net.URL; import java.util.Map; import java.net.HttpURLConnection;; pub ...
- MySQL5.6安装步骤(windows7/8_64位)
[转]MySQL5.6安装步骤(windows7/8_64位) 1. 下载MySQL Community Server 5.6.11 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义 ...
- easyui中combotree只能选子选项,父级不被选中
前言 前几天面试遇到一个需求(easyui中combotree只能选子选项,父级不被选中),回来特意整理下,大概的思想是如果该tree的节点被选中是判定一下是否有子节点,如果没有就说明是最终节点了,步 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何添加自定义Task,如何让程序的一部分拥有不同的执行周期
右击Tasks,添加一个新的Task,可以设置这个新的任务的扫描周期,比如100ms 右击PLC的整个的Project,然后Add一个Referenced Task,选中你新建的Task 在P ...