与C语言另一个不同点就是C++具有可继承性,这也是C++的一大优势。继承关系主要存在于类与类之间,继承的类称之为子类(派生类),被继承的类称之为父类(基类)。继承关系中,子类无条件拥有父类中的所有属性和方法。继承的写法用“:”表示,一般地,继承方式为public形式,具体地写法如下面的例子:
#include <iostream>
using namespace std;
class A{ //定义父类A
int i;
int j;
public:
void setIJ(const int x, const int y){
i = x;
j = y;
}
int getI()const{
return i;
}
int getJ()const{
return j;
}
};
class B : public A{ //定义子类B继承父类A,B具有A中所有属性和方法
};
int main(){
B b; //分配类B的对象
b.setIJ(4, 5); //合法,虽然setIJ是类A中的方法,但B继承了A,因此B也具有该方法
cout << "类B中的i = " << b.getI() << " 以及类B中的j = " << b.getJ() << endl;
}
输出结果:
同样地,子类在继承父类的同时,也可以定义自己的方法和属性,但是父类却无权访问子类中的属性和方法,例如:
#include <iostream>
using namespace std;
class A{ //定义父类A
int i;
int j;
public:
void setIJ(const int x, const int y){
i = x;
j = y;
}
int getI()const{
return i;
}
int getJ()const{
return j;
}
};
class B : public A{ //定义子类B继承父类A,B具有A中所有属性和方法
int k;
public:
void setK(const int z){
k = z;
}
int getK()const{
return k;
}
};
int main(){
B b; //分配类B的对象
b.setIJ(4, 5); //合法,虽然setIJ是类A中的方法,但B继承了A,因此B也具有该方法
cout << "类B中的i = " << b.getI() << " 以及类B中的j = " << b.getJ() << endl;
b.setK(6); //设置自己的属性
cout << "类B自己的属性: k = " << b.getK();
A a; //给父类分配一个对象
a.setK(7); //此处产生编译错误,setK()是子类中独有的方法,父类中没有,因此父类无权访问
}
对于构造函数和析构函数,如果对子类进行分配对象,则在构造子类之前,一定会先构造父类,不同的是,先构造的对象,后被析构,也即先析构子类再析构父类,例如:
#include <iostream>
using namespace std;
class A{ //定义父类A
public:
A(){
cout << "构造父类A\n";
}
~A(){
cout << "析构父类A\n";
}
};
class B : public A{ //定义子类B继承父类A,B具有A中所有属性和方法
public:
B(){
cout << "构造子类B\n";
}
~B(){
cout << "析构子类B\n";
}
};
int main(){
A* a = new A; //调用A的构造函数,而不会调用B
delete a; //调用A的析构函数,而不会调用B
cout << "\n***************************************\n\n";
B* b = new B; //先调用A的构造函数,再调用B的构造函数
delete b; //先调用B的析构函数,再调用A的析构函数
}
输出结果:
如有错误,欢迎大家批评与指正!