c++第九次作业(谭浩强c++程序设计第三版P400习题)

1.改写为多文件程序????????????????

2.比较函数重载和虚函数在概念和使用方式上的区别

        1)概念上:

                1>函数重载在同一个类中,虚函数是父类与子类

                2>函数重载时重载的函数必须具有相同的函数名,且函数的参数个数和参数类型二者中至少有一个同。

                    虚函数则要求同一类族中的所有虚函数的函数名,函数类型,函数的参数个数和参数类型都全部相同

        2)使用上:

                1>函数重载可以用于非成员函数和类的成员函数,而虚函数只能用于类的成员函数

                2>函数重载可用于构造函数,而虚函数能用于构造函数

        3)两者的定义:

                1>函数重载是在同一个类中,相同名称同形式参数的若干个函数,因此只要参数同就可以调用这些同名称而同内容的函数。
                2>虚函数是父类与子类中名称相同且参数相同的函数,因此在定义对象时,如果对象是父类的对象执行的是父类的虚函数,如果对象是子类的对象执行的是子类虚函数。

3.(1)把构造函数修改为带参数的函数

#include <bits/stdc++.h>
using namespace std;

class Point{
	public:
		Point(int a,int b):x(a),y(b){}
		~Point(){
			cout<<"executing Point destructor"<<endl;
		}
	private:
		int x;
		int y; 
};
class Circle:public Point{
	public:
		Circle(int a,int b,int r):Point(a,b),radius(r){}
		~Circle(){
			cout<<"executing Circle destructor"<<endl;
		}
	private:
		int radius;
};

int main()
{
	Point *p=new Circle(3,2,1); 
	delete p;
	return 0;
}

                分析(理解将基类的析构函数定义为虚函数的作用):

                ​​​​​​​        

                         p是指向基类的指针变量,指向new所开辟的动态存储空间。

                         这里只执行了基类的析构函数,没有执行派生类的析构函数。

                       (如果想要执行派生类的虚构函数,则把基类的析构函数定义为虚函数,这样两个的析构函数都可以执行了)

                 强调:基类的析构函数被定义为虚函数了,仍然可以执行!!(构造函数能被定义为虚函数)

        (2)将基函数的析构函数设置为virtual,main()中设置一个指向Circle类对象的指针变量

#include <bits/stdc++.h>
using namespace std;

class Point{
	public:
		Point(){}
		~Point(){
			cout<<"executing Point destructor"<<endl;
		}
};

class Circle:public Point{
	public:
		Circle(int r):radius(r){}
		~Circle(){
			cout<<"executing Circle destructor"<<endl;
		}
	private:
		int radius;
};

int main()
{
	Circle gradl(2);
	Circle *c=&gradl;
	return 0;
}

                分析:1>派生类析构对象时会调用基类类的析构函数(析构函数调用的次序是先派生类的析构后基类的析构)

                          2>派生类创建对象时也会调用基类的构造函数(先调用基类的构造函数、然后调用派生类的构造)(与析构函数调用次序相反

 

4.抽象基类

        1.明白纯虚函数的意义(含有纯虚函数的类,能定义类对象)

           原因:如果含有纯虚函数的类可以定义对象,那么该对象就应该可以调用类中的纯虚函数,但是纯虚函数是没有实现的,这就是个矛盾的。

        2.掌握虚函数的定义(父类与子类函数形式完全相同)

#include <bits/stdc++.h>
#define PI 3.1415926
using namespace std;

class Shape{
	public:
		Shape(){} 
		virtual void area(){}
};

class Circle:public Shape{
	int radius;
	public:
		Circle(int r):radius(r){}
		virtual void area();
};

void Circle::area()
{
	cout<<PI*radius*radius<<endl;
} 

class Rectangle:public Shape{
	int chang,kuan;
	public:
		Rectangle(int c,int k):chang(c),kuan(k){}
		virtual void area();
};

void Rectangle::area()
{
	cout<<chang*kuan<<endl;
} 

class Triangle:public Shape{
	int di,gao;
	public:
		Triangle(int d,int g):di(d),gao(g){}
		virtual void area();
};

void Triangle::area()
{
	cout<<di*gao/2<<endl;
} 

void PrintArea()
{
	Shape s;
	Circle c(2);
	Rectangle r(4,5);
	Triangle t(4,5);
	Shape *p=&s;
	p=&c;
	p->area() ;
	p=&r;
	p->area() ;
	p=&t;
	p->area() ; 
}

int main()
{
	PrintArea();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴同学·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值