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;
}