C++有三大思想:抽象与封装、继承与派生、多态性,是c++开发人员面对对象编程必须掌握的知识。
初学者对子类继承中构造函数的写法有时会存在一些问题。即子类继承基类时,子类的构造函数如何实现呢?如何调用基类的成员变量?相信大部分初学c++时,都会遇到类似的问题。
我们都知道继承中,当子类建立一个对象时,执行构造函数的顺序是:
①派生类构造函数先调用基类的构造函数
②再执行派生类构造函数本身(即派生类构造函数的函数体)
派生类的构造函数可以大致分为:
a.简单的派生类的构造函数
格式:
派生类构造函数名(总参数表):基类构造函数名(参数表)
{
派生类中新增数据成员初始化语句
}
b.有子对象的派生类的构造函数
格式:
派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数表)
{
派生类中新增数据成员初始化语句
}
c.多层派生时的构造函数
注意:不是定义基类构造函数,而是调用积累的额构造函数,因此这些参数是实参而不是形参。
下面用代码讲解一下子类构造函数的实现。
①定义class A,class B继承class A,class C继承class B:
class A
{
public:
A(int a1, int b1, char c1);
int a;
int b;
char c;
};
class B : public A
{
public:
B();
B(int a1, int b1, char c1);
};
class C :public B
{
public:
C();
C(int a1, int b1, char c1);
};
class A的构造函数实现:
A::A(int a1, int b1, char c1)
{
a = a1;
b = b1;
c = c1;
}
②class B的构造函数实现
B::B() :A(a, b, c)//调用基类的成员变量值
{
a = 20;
b = 10;
c = 'g';
}
B::B(int a1, int b1, char c1) :A(a, b, c)//构造函数的重载
{
a = a1;
b = b1;
c = c1;
}
③class C的构造函数实现
C::C() :B()
{
}
C::C(int a1, int b1, char c1) : B(a,b,c)
{
a = a1;
b = b1;
c = c1;
}
//C::C(int a1, int b1, char c1) : B()//与上面一样
//{
// a = a1;
// b = b1;
// c = c1;
//}
④main函数代码:
int main(int argc, char *argv[])
{
A ff(1, 2, 'c');
cout << ff.a <<" "<< ff.b <<" "<< ff.c << endl;
B b1;
cout << b1.a <<" "<< b1.b <<" "<< b1.c << endl;
B b2(10,10,'i');
cout << b2.a << " " << b2.b << " " << b2.c << endl;
C c1;
cout << c1.a << c1.b << c1.c << endl;
C c2(100,100,'u');
cout << c2.a << c2.b << c2.c;
system("pause");
return 0;
}
结果: 1 2 c
20 10 g
10 10 i
20 10 g
100 100 u