第十章:继承
将父类中一些属性设置为protected,在子类中可以访问
class Student::public Person
{……};
方法中可直接运用,如
{……
Person::print();}
第十一章 多态性
同样的消息在发送给不同对象时会产生多种形式的结果
1.读取文件:
#include<iostream>
#include <fstream>
#include <string>
//#include "1.h"
using namespace std;
void readInformation()//读文件
{
ifstream file("1.txt");
string name,address,phone,qq,mail;
while(!file.eof())
{
file>>name>>address>>phone>>qq>>mail;
cout<<name<<"\t"<<address<<"\t"<<phone<<"\t"<<qq<<"\t"<<mail<<endl;
}
}
void main()
{
readInformation();
}
2.const形参与非const形参
原因在于实参传递方式不同,普通形参时,操纵的是实参的副本,而无法修改实参的值,是否是const无所谓;对于指针形参和引用形参时,改变的是实参本身,没有const的形参的实参可以改变
#include <iostream>
#include <string>
using namespace std;
void print_str( const string &s)//(string s)√(string &s)×
{
cout<<s<<endl;
}
int main()
{
print_str("hello world");//这是const实参,所以需要为cons形参
return 0;
}
3.利用虚函数实现的多态性来求各种图形的面积
虚函数:实现多态的接口函数
1.h
#pragma once
class Shape
{
public:
Shape();
virtual ~Shape();//具有多态的析构函数,最好也加上virtual
virtual double Area()=0;//纯虚函数,不需要函数体,即=0
};
1.cpp
#include "1.h"
Shape::Shape()
{
}
Shape::~Shape()
{
}
2.h
#pragma once
#include "1.h"
class Square:public Shape//继承用:一个
{
public:
Square();
Square(double s);
~Square();
void setSide(double s)
{
side=s;
}
double getSide()
{
return side;
}
double Area();
private:
double side;
};
2.cpp
#include "2.h"
Square::Square()
{
}
Square::Square(double s)
{
setSide(s);
}
Square::~Square()
{
}
double Square::Area()
{
return side*side;
}
3.h
#pragma once
#include "1.h"
class Circle:public Shape
{
public:
Circle();
Circle(double r);
~Circle();
void setRadius(double r)
{
radius=r;
}
double getRadius()
{
return radius;
}
double Area();
private:
double radius;
};
3.cpp
#include "3.h"
#define PI 3.14
Circle::Circle()
{
}
Circle::Circle(double r)
{
setRadius(r);
}
Circle::~Circle()
{
}
double Circle::Area()
{
return PI* radius * radius;
}
4.cpp
#include <iostream>
#include "2.h"
#include "3.h"
using namespace std;
void main()
{
/************************************************************************/
/* 方法一 */
/************************************************************************/
Shape *shape;
Square s;
s.setSide(10.0);
shape=&s;
cout<<"正方形面积"<<shape->Area()<<endl;//多态核心,用基类指针访问
Circle c;
c.setRadius(5.0);
shape=&c;
cout<<"圆形面积"<<shape->Area()<<endl;//用c.Area()一样,但为了显示多态用前者
/************************************************************************/
/* 方法二 */
/************************************************************************/
Shape *ss[2];//是一个指针数组:数组元素全为指针。
ss[0]=new Square(1.0);
ss[1]=new Circle(2.0);
double area=0.0;
for(int i=0;i<2;i++)//在for括号里声明一次循环外就释放了
{
area+=ss[i]->Area();
}
cout<<"总面积为"<<area<<endl;
//释放内存
for(int i=0;i<2;i++)//所以可以重复用i并声明
{
delete ss[i];
}
//错误!delete []ss×
}
4. 指针数组&数组指针&动态数组
指针数组:int*a[4]; 数组里的元素都是指针,也可用delete a[i],释放内存
常也这样表示:
typdef int*pInt; pInt a[4];
数组指针:int (*a)[4];指向数组a的指针,它指向包含4个int元素的一维数组,
*p+i是二维数组a[i]的地址; 与纯数组有些区别,但也可直接int *a, p+i则是地址
动态数组:int *p=new int [len];
……
delete[] p;