第十章 面向对象编程:继承和多态

第十章:继承

将父类中一些属性设置为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的指针,它指向包含4int元素的一维数组,

*p+i是二维数组a[i]的地址; 与纯数组有些区别,但也可直接int *a, p+i则是地址

动态数组:int *p=new int [len];

……

delete[] p;







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值