初始化列表和派生类构造函数中的基类参数表
引例
在图形这个抽象类上派生出矩形类和圆形类,两者都有计算对象周长的函数,并编写测试main()函数
使用初始化列表
#include<iostream>
using namespace std;
class Shape
{
public:
Shape() {}
~Shape() {}
//获取对象周长
virtual double GetPerim() = 0;
};
class Rectangle:public Shape
{
private:
double L, W;
public:
Rectangle(double i,double j):L(i),W(j) {}
~Rectangle() {}
double GetPerim()
{
return 2*(L + W);
}
};
class Circle:public Shape
{
private:
double R;
public:
Circle(double r):R(r){}
double GetPerim()
{
return 3.1416 * 2 * R;
}
};
int main()
{
Shape *sp;
sp = new Circle(10.0);
cout << "圆的周长:" << sp->GetPerim() << endl;
sp = new Rectangle(10,6);
cout << "矩形的周长:" << sp->GetPerim() << endl;
return 0;
}
初始化成员列表注意事项:
1.对于const修饰的数据成员和引用类型成员只能用其初始化
2.数据成员的初始化按照类中声明顺序说明,与他们在成员初始化列表中列出的顺序无关
使用派生类构造函数中的基类参数表
#include<iostream>
using namespace std;
class Figure
{
protected:
double x, y;
public:
Figure(double a, double b):x(a), y(b) {}
~Figure() {}
virtual double GetPerim() = 0;
};
class Rectangle:public Figure
{
public:
Rectangle(double a, double b):Figure(a, b) {}
double GetPerim()
{
return 2 * (x + y);
}
};
class Circle:public Figure
{
public:
Circle(double a):Figure(a, a) {}
double GetPerim()
{
return 2 * 3.1416 * x;
}
};
int main()
{
Figure *p;
Rectangle t(10, 6);
Circle c(10.0);
p = &t;
cout << "矩形周长"<<p->GetPerim()<<"" << endl;
p = &c;
cout << "圆周长"<<p->GetPerim()<<"" << endl;
return 0;
}
派生类构造函数传参注意事项:
1.派生类构造函数起到将参数传递给基类构造函数形参。
a.当基类构造函数不带参数时,派生类不一定需要定义构造函数
b.当基类的构造函数函数有参数时,其所有派生类都必须定义构造函数。
若定义的派生类构造函数为空,则其仅仅起到参数传递的作用。
2.类中声明派生类构造函数时,不用带基类构造函数名及其参数表,只有在类外定义时才将其列出