类的继承可以看做父亲与儿子之间的关系,儿子可以继承父亲的属性,并且自己进行扩展
写法(:继承方式 继承的父类)
class Son:public Father
父类又叫做基类
//父类(基类)
class Father
{
public:
int fa;
void funfa()
{
cout << "funfa()" << endl;
}
};
子类又叫做派生类
//子类(派生类)
class Son:public Father
{
public:
int son;
void funson()
{
fa = 10;
funfa();
}
};
可以定义子类对象,通过子类对象,对父类的成员进行调用
Son son;
son.funson(); //funfa()
cout << son.fa << endl; //10
son.funfa(); // funfa()
作为派生类:包含父类,也包含父类成员,能够直接使用父类的成员。
子类看作是对父类的扩展和延续
当父类和子类包含同名的属性成员时
class Father
{
public:
int fa;
void funfa()
{
cout << "funfa()" << endl;
}
int money;
};
class Son:public Father
{
public:
int son;
int money;
子类函数有限调用子类属性,如要使用父类同名属性,需要指明类名作用域
class Son:public Father
{
public:
int son;
int money;
void funson()
{
fa = 10;
funfa();
}
void funmoney()
{
money = 100;
Father::money = 200;
}
};
son.funmoney();
cout <<"son.money: " << son.money << " " <<"son.Father::money: "<< son.Father::money << endl;
输出结果
定义子类对象计算其大小也包含父类属性
cout << sizeof(Son) << endl;
父类与子类内存排布
父类在前,子类在后
cout << "类地址:" << &son << endl;
cout << "fa:" << &son.fa << endl;
cout << "son.Father::money:" << &son.Father::money << endl;
cout << "son:" << &son.son << endl;
cout << "son.Son::money:" << &son.Son::money << endl;
定义子类对象,子类和父类的构造都会执行,顺序:父类->子类
下面利用一段代码进行测试
class Father
{
public:
int fa;
Father() :fa(1) { cout << "Father" << endl; }
};
class Son :public Father
{
public:
int son;
Son() { cout << "Son" << endl; }
};
int main()
{
Son son;
return 0;
}
测试结果
可以看到先调用了父类的构造函数执行输出语句,后调用子类构造函数输出语句
析构函数则是相反
先调用子类再调用父类
下面也用代码来测试一下
class Father
{
public:
int fa;
Father() :fa(1) { cout << "Father" << endl; }
~Father(){cout << "~Father()" << endl;}
};
class Son :public Father
{
public:
int son;
Son() { cout << "Son" << endl; }
~Son() { cout << "~Son()" << endl; }
};
测试结果
在子类的初始化参数列表中,会自动调用父类的无参构造函数,在子类的初始化参数列表中,跳转到父类的构造函数
如果想要使用父类的带参构造,必须手动显示的指定调用
int fun()
{
cout << "fun" << endl;
return 2;
}
Son(int a) :Father(a), son(fun()) { cout << "Son" << endl; }
总结
定义子类对象,子类和父类的构造都会执行
构造顺序:父类->子类
析构顺序:子类->父类
因为定义的是子类对象,其生命周期结束,匹配自己类的析构函数,在回收对象本身的空间
在回收对象时,回收顺序与初始化顺序相反,回收子类自己的成员,如果有其他类的成员,则调用其类的析构函数,
最后是继承的父类,调父类的析构.