c++学习笔记四(继承)

本文详细探讨了C++中的继承机制,包括构造顺序、析构顺序以及虚继承的作用。强调了在派生类构造时先构造父类对象,而析构时则先析构子类对象。解释了虚继承如何解决多重继承中的重复构造问题,通过实例展示了虚继承构造顺序的差异,并补充了关于空类和存储空间的知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
子类继承父类的默认方式是private继承
另外:在C++中结构体也是可以互相继承的,它们之间的继承关系默认是public的

在这里插入图片描述
示例:

#include <iostream>
#include <cmath>
using namespace std;

class Triangle{
//private:					//父类的私有成员子类函数不能访问,但是父类函数和友元函数可以访问

protected:          		//保护成员变量可以被子类函数访问,也可以被父类函数访问
    int a,b,c;				//protect是为继承量身定制
public:
    Triangle(int a,int b,int c):a(a),b(b),c(c){}
    int GetLength()const{
        return a+b+c;
    }
    float GetArea()const{
        float p = (a+b+c)/2.0;
        return sqrt(p*(p-a)*(p-b)*(p-c));
    }
//    int GetA()const{ return a;}
};

class EqualTriangle:public Triangle{
public:
    EqualTriangle(int bottm,int side):Triangle(bottm,side,side){}
    int GetBottom()const{					//子类的成员函数可以访问父类protected的成员变量
        return a;
    }
    int GetSide()const{
        return b;
    }
};
int main(){
    cout << sizeof(EqualTriangle) << endl;
    EqualTriangle e(10,15);
    cout << e.GetLength() << endl;			//子类对象可以访问父类所有成员函数
    cout << e.GetArea() << endl;

    cout << e.GetBottom() << endl;			//访问成功
    cout << e.GetSide() << endl;
}

示例二:

#include <iostream>
using namespace std;

class Simple{
private:
    void Private(){
        cout << __func__ << endl;
    }
protected:
    void Protected(){
        cout << __func__ << endl;
    }
public:
    void Public(){
        cout << __func__ << endl;
    }
    void Test(){							//在类中可以访问类中的任何成员
        cout << __func__ << endl;
        Public();
        Protected();
        Private();
    }
};

int main(){
    Simple t;
//    t.Test();
    t.Public();								//对象只能访问类中的public成员
//    t.Protected();
//    t.Private();
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.继承关系的构造顺序

派生类的构造函数与析构函数的调用顺序
派生类的构造函数调用顺序
父对象构造、成员变量构造、子对象构造的顺序
先构造父类对象,再构造子类对象。连父亲都没有,哪有儿子。

派生类的析构函数调用顺序
子对象析构、成员变量析构、父对象析构的顺序(同样与构造的顺序刚好相反)
先析构子类对象,再析构父类对象。要先把孩子交给父亲,然后父亲才会离开,不然孩子就丢了。

示例:

#include <iostream>
using std::cout;
using std::endl;
class Member{
public:
    Member(int i){
        cout << "Member Init" <<endl;
    }
    ~Member(){
        cout << "Member Destroy" <<endl;
    }
};
class Parent{
public:
    Parent(int i){
        cout << "Parent Init" <<endl;
    }
    ~Parent(){
        cout << "Parent Destory" <<endl;
    }
};
class Son
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值