C++中的可继承性

与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的析构函数
}

输出结果:

如有错误,欢迎大家批评与指正!

猜你喜欢

转载自blog.csdn.net/WJ_SHI/article/details/82254269