回顾:
1.友元 friend

2.运算符重载

类型 operator运算符(参数表)

抽象、封装
类是面向对象程序设计中最基本的概念
类的背后隐藏的思想是数据抽象和封装
是进行封装和数据隐藏的工具,它将数据和对数据操作紧密的结合在一起。

定义一个类,定义其数据成员、成员函数的过程称为封装类
------------------------------
1.继承与派生
在C++中,所谓继承就是在一个已存在的类的基础上建立一个新的类,已存在的称为基类(base class)或父类(father class),新建立的类称为派生类(derived class)或子类(son class).

一个新类从已有类那里获得其已有特性,这种现象称为类的继承
从另一个角度说,从已有的类产生一个新类的过程就是类的派生

继承实现了代码的重用。

class person
{
string name;
int age;

};

class student : person
{

float sco;
};

C++派生类的声明方式:
class 派生类名 : [继承方式] 基类名
{
//派生类新增加的成员
};

继承方式:
public
private
protected

2.派生类的构造
派生类的成员包括两个部分:
从基类继承过来的成员
自己增加的成员

构造一个派生类包括以下工作:
1.从基类接收成员
派生类把基类的全部成员(不包括构造函数和析构函数)接收过来

2.调整从基类接收的成员

3.增加自己的特性

3.派生类成员的访问属性
1.基类的成员函数访问基类的成员 可以的
2.派生类的成员函数访问派生类的成员 可以
3.基类的成员函数访问派生类的成员 不可以
4.派生类的成员函数访问基类的成员 ???
5.在派生类内部访问派生类的成员 可以
6.在派生类的外部访问基类的成员 ???

如何确定基类成员在派生类中的访问属性:
要考虑基类成员本身的访问属性
要考虑派生类所声明的对基类的继承方式

不同的继承方式决定了基类成员在派生类的访问属性:
public:公有继承
基类的公有成员和保护成员在派生类中保持原有的访问属性,基类的私有成员仍为基类私有。

private:私有继承
基类的公有成员和保护成员在派生类中成了私有成员,基类的私有成员仍为基类私有
protected:保护继承
基类的公有成员和保护成员在派生类中成了受保护成员,基类的私有成员仍为基类私有。保护成员的意思是,不能被外界访问,但可以被派生类的成员访问。

4.私有继承
私有基类中的成员 在私有派生类中的访问属性 在私有派生类外的访问属性
私有成员 不可访问 不可访问
公有成员 可访问 不可访问
保护成员 可访问 不可访问

由于私有继承限制太多,一般不常用。

5.公有继承
公有基类中的成员 在公有派生类中的访问属性 在公有派生类外的访问属性
私有成员 不可访问 不可访问
公有成员 可访问 可访问
保护成员 可访问 不可访问

最常用的继承方式。

6.保护继承
保护基类中的成员 在保护派生类中的访问属性 在保护派生类外的访问属性
私有成员 不可访问 不可访问
公有成员 可访问 不可访问,但其子类可以访问
保护成员 可访问 不可访问,但其子类可以访问

----------------------------------------------------------------------
总结:
基类中的成员 在公有派生类中 在私有派生类中 在保护派生类中
私有成员 不可访问 不可访问 不可访问
公有成员 公有 私有 保护
保护成员 保护 私有 保护

7.派生类中的构造函数和析构函数
当基类的构造函数没有参数,或者没有显式定义构造函数时,子类可以不向父类传递参数,甚至可不定义构造函数。

当基类含有带参数的构造函数时,子类必须定义构造函数,以提供把参数传递给父类构造函数的途径。

在C++中,子类构造函数的一般形式:
派生类的名(参数总表):基类名(参数)

//派生类新增加的数据成员初始化

在创建派生类对象时,先执行基类的构造函数,再执行派生类的构造函数
在销毁派生对象时,先执行派生类的构造函数,再执行基类的析构函数

8.多重继承(略)

9.函数重写
在子类中定义与父类中原型相同的函数
函数重写只发生在父类与子类之间
父类中被重写的函数依然会继承给子类,默认情况下子类中的函数会隐藏父类中的函数。
通过作用域运算符::访问到父类中被隐藏的函数

10.赋值兼容性原则

基类与派生类对象之间也存在有赋值兼容关系
基类与派生类对象之间的赋值兼容原则:
指在需要基类对象的任何地方,都可以使用 公有派生类 的对象来替代。

具体地说:
1.子类对象可以向父类对象赋值
Child c;
Parent p = c;
2.子类对象可以初始化父类对象的引用
Parent &rp = c;
3.子类对象的地址可以赋值给指向父类对象的指针
Parent *pp = &c;
4.如果函数的形参是父类对象或父类对象的引用,在调用函数时,可用子类对象作为实参。

11.当赋值兼容性原则 遇上 函数重写

12.虚函数
虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数。

虚函数的作用是允许在派生类中重新定义与基类同名(函数原型完全相同)的函数,并且可以通过 基类的 指针 来访问基类和派生类中的同名函数。、

格式:
virtual 函数类型 函数名(参数表)

函数体

13.多态性
多态 的意思是一个事物有多种形态
在面向对象方法中,所谓多态就是不同对象收到相同的消息,产生不同的行为
在C++中,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,这样就可以用同一个函数名调用不同内容的函数
也就是说,可以用同样的接口访问功能不同的函数,从而实现 ‘一个接口 多种方法’

多态性分为两类:
静态多态性:静态多态性是通过 函数重载,运算符重载来实现的。
动态多态性:运行时多态性,动态多态性是通过虚函数来实现的。

14.纯虚函数与抽像类

class che
{
public:
virtual stop()=0;

private:
lunzi

};

clas shape
{
virtual area()=0;
};
纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,但要求在它的派生类中根据需要对它进行定义,或仍说明为纯虚函数。
声明纯虚函数的一般形式:
virtual 函数类型 函数名(参数表)=0;

包含纯虚函数的类,就是抽象类。
注:抽象类不能用来实例化对象,但是可以定义指向抽象类的指针。

作业:
定义一个点类,以它为父类,派生一个圆类,求圆的面积,然后以圆类为基类,派生一个圆柱,求圆柱的表面积、体积。
然后,重载<<可以用来输出点、圆、圆柱。
约定:
点:Point(x,y);
圆:Circle(x,y,r);
圆柱:cylinder(x,y,r,h);

答案代码

#include<iostream>
#include<cstdio>
using namespace std;

class Point
{
public:
Point(double a,double b)
{
x=a;
y=b;
}
~Point()
{

}
private:
double x;
double y;
};

class Circle:public Point
{
public:
Circle(double a,double b,double c):Point(a,b)
{
r=c;
s=3.14*r*r;
}
double get_s()
{
return s;
}
void show()
{
cout<<s<<endl;
}
friend ostream& operator<<(ostream &o,Circle &c);
~Circle()
{

}
private:
double r;
double s;
};

class Cylinder:public Circle
{
public:
Cylinder(double x1,double y1,double r1,double h1):Circle(x1,y1,r1)
{
h=h1;
ss=get_s();
cy=ss*h;
}
void show1()
{
cout<<cy<<endl;
}
friend ostream& operator<<(ostream &o,Cylinder &cyl);
~Cylinder()
{

}
private:
double h;
double ss;
double cy;
};

ostream& operator<<(ostream &o,Circle &c)
{
o<<c.s;
return o;
}

ostream& operator<<(ostream &o,Cylinder &cyl)
{
o<<cyl.cy;
return o;
}

int main(void)
{
Circle c(0,0,1);
//c.show();
cout<<c<<endl;
Cylinder cy1(0,0,1,2);
//cy.show1();
cout<<cy1<<endl;
return 0;
}

#include<iostream>
using namespace std;

class person
{
public:
void show()
{
cout << name << "," << age << endl;
}
private:
string name;
protected:
int age;

};

class student: protected person
{
public:

void show1()
{
show();
// cout << name <<endl;//error
cout << age << endl;
}

private:
int num;

};

class xstudent:public student
{

public:
void show2()
{
show1();//ok
cout << name << endl;//error
cout << age << endl;//?
cout << num << endl;//error
}
private:
int money;
};
int main()
{
xstudent xs;
xs.show2();
//s.show1();
/*
s.show();
s.name = "zhangfei";
s.age = 20;
*/

}

#include<iostream>
using namespace std;
class Parent
{
public:
Parent(string n,int a)
{
name = n;
age = a;
cout << "Parent() " << endl;
}
void show()
{
cout << name << endl;
cout << age << endl;
}
~Parent()
{
cout << "~Parent()" << endl;
}
private:
string name;
int age;

};

class Child:public Parent
{
public:
Child(string sn,int a,int n):Parent(sn,a)
{
num = n;
cout << "Child()" << endl;
}
void show()
{
Parent::show();
cout << num << endl;
}
~Child()
{
cout << "~Child()" << endl;
}
private:
int num;
};

int main()
{
Child c("guanyu",21,007);
c.show();
cout << "-----------------" << endl;
c.Parent::show();

}

#include<iostream>
using namespace std;
class Parent
{
public:
Parent(string n,int a)
{
name = n;
age = a;
cout << "Parent() " << endl;
}
virtual void show()
{
cout << name << endl;
cout << age << endl;
cout << "父类的show()" << endl;
}
~Parent()
{
cout << "~Parent()" << endl;
}
private:
string name;
int age;

};

class Child:public Parent
{
public:
Child(string sn,int a,int n):Parent(sn,a)
{
num = n;
cout << "Child()" << endl;
}
void show()
{
cout << "子类的show()" << endl;
cout << num << endl;
}
~Child()
{
cout << "~Child()" << endl;
}
private:
int num;
};

void func(Parent* p)
{
p->show();

}

int main()
{
Child c("guanyu",21,007);
Child c2("liubei",22,8);
c.show();
cout << "-----------------" << endl;

Parent *pp = &c;
pp->show();
pp = &c2;
pp->show();

cout << "---------------------" << endl;
func(&c);
func(&c2);
}

C++第五天学习的更多相关文章

  1. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  2. 20145213《Java程序设计》第五周学习总结补充

    20145213<Java程序设计>第五周学习总结补充 教材学习内容总结 欠的账都是要还的!第九章的内容躲过对酒当歌的夜,躲不过四下无人的街.由于第五周贪玩,疏忽冷落了Collection ...

  3. 20145213《Java程序设计》第五周学习总结

    20145213<Java程序设计>第五周学习总结 教材学习内容总结 "素衣莫起风尘叹,犹及清明可到家."每每念此,不得不心疼自己.古人清明长假都进城耍了,还担心自己清 ...

  4. 20145337 《Java程序设计》第五周学习总结

    20145337 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 JAVA中的所有错误都会被包装成对象,如果你愿意,可以尝试执行并捕捉代表错误的对象后做一些处理.使用了try ...

  5. 20145218 《Java程序设计》第五周学习总结

    20145218 <Java程序设计>第五周学习总结 教材学习内容总结 异常 程序中总有些意想不到的状况所引发的错误,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失 ...

  6. 《Java程序设计》第五周学习总结

    20145224 <Java程序设计>第五周学习总结 教材学习内容总结 第八章异常处理 8.1.1使用try.catch ·教材范例用户连续输入整数,输入0结束后显示输入数的平均值(代码如 ...

  7. 20155304 2016-2017-2 《Java程序设计》第五周学习总结

    20155304 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 try catch JVM会先尝试执行try区块中的内容,若发生错误且与catch后 ...

  8. 201521123072《java程序设计》第五周学习总结

    201521123072<java程序设计>第五周学习总结 标签(空格分隔): java学习 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码 ...

  9. 201521123038 《Java程序设计》 第五周学习总结

    201521123038 <Java程序设计> 第五周学习总结 1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.ja ...

  10. 201521123061 《Java程序设计》第五周学习总结

    201521123061 <Java程序设计>第五周学习总结 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 1.代 ...

随机推荐

  1. usb免驱动摄像头实验

    1.编译openwrt系统内核使它支持usb,进入在/openwrt/trunk上执行make menuconfig 2.1). 添加USB 相关支持Kernel modules —> USB ...

  2. UVa 816 Abbott的复仇(BFS)

    寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同, ...

  3. Base64编码与图片互转

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  4. CA Loves GCD

    Problem Description CA is a fine comrade who loves the party and people; inevitably she loves GCD (g ...

  5. Python中super的用法

    super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承)等种种问题.总之前人留下的经验就是:保持一致性 ...

  6. Android中通过pid获取app包名

    String callerPackage = getAppNameByPID(getContext(), Binder.getCallingPid()); private String getAppN ...

  7. Linux下的强大工具之一sed(转),Shell必备

    sed命令基本用法sed是一个非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以是来自键盘输入.文件重定向.字符串.变量.来自管道的文本等等.sed从文本的一个文本行或标准输入中读取 ...

  8. ngx_http_core_module模块提供的变量

    ngx_http_core_module模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它nginx模块.在我们对请求做策略如改写等等都会使用到一些变量,顺便对ngx ...

  9. 【转】C++中this指针的用法详解

    1.this指针的用处 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象 ...

  10. STM32 对内部FLASH读写接口函数(转)

    源:STM32 对内部FLASH读写接口函数 因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. ...