C++ 类的构建,继承,派生上的小细节

2023-11-14

自己从C过渡到学C++的时候,对于面向过程和面向对象两种编程思想一直模模糊糊分不清楚,所以花了很大的功夫(侧面说明我可能不适合编程?)为了提醒,也是为了做一点小总结,特意总结了一些学习的时候发现的易错点

一、类在声明的时候,必须要写清private和public,否则编译器会默认你的所有函数和变量都是private形式,如果在后期需要进行public型继承,就会报错

class Point{
private:
    int x;
    int y;
    void Position(int x,int y)
    {
        cout<<x<<y<<endl;
    }
public:
    Point(){
        cout<<"我是构造函数我自豪"<<endl;
    }
    
    int Distance(int x,int y)
    {
        return x*x+y*y;
    }
};

二、如果在继承的时候,需要使用到基类的一些函数或者变量,这些变量的声明形式不同,使用方式也不同

1.如果需要调用的函数/变量在基类中是私有成员(private):在子类中调用,或者在主函数中声明的对象中使用的时候,会出现报错

比方说,我现在要在Point的基础上派生出一个Rectangle的类

class Rectangle:public Point

如果我再Rectangle里再次直接构造一个构造函数,就会报错 

如果想在子类中重新定义构造函数,必须要先声明继承的来源parent

好像还是有什么地方不对,原来是作为私有成员的xy不能被直接调用

我们把Rectangle的构造函数再修改一下,接口变为和基类相同

Rectangle(int x,int y):Point(x,y)
    {
        cout<<"我是矩形"<<endl;
    }

这下就没问题了

同理对于下面的调用方式,只要保证数据传入,就可以正常使用

 void Rec_Distance(int x,int y)
    {
        cout<<Distance(x, y)<<endl;
    }
    

2.如果是在一个类当中,直接在public里调用自身的私有成员,是始终没有问题的

class Point{
private:
    int x;
    int y;
    void Position(int x,int y)
    {
        cout<<x<<y<<endl;
    }
public:
    Point(int x,int y){
        cin>>x>>y;
        cout<<"我是构造函数我自豪"<<"我的位置就在"<<x<<y<<endl;
    }
    
    int Distance(int x,int y)
    {
        Position(x, y);
        return x*x+y*y;
    }
    ~Point()
    {
        cout<<"啊,我被删除了!"<<endl;
    }
};

可以看出,Position作为私有成员函数是可以被成功调用的

3.如果是在子类当中呢?

可以看出,这个就没有办法成功调用了

4.析构函数

不过,在析构函数的使用中,就没有那么多讲究了,可以直接使用

 ~Rectangle(){
        cout<<"啊,矩阵被删除了!"<<endl;
    }

没有报错

5.最后使用的时候的结果

int main()
{
    cout<<"Please input"<<endl;
    Rectangle rectangle(1,2,3,4);
    return 0;
}

 

class Point{
private:
    int x;
    int y;
    void Position(int x,int y)
    {
        cout<<x<<y<<endl;
    }
public:
    Point(int x,int y){
        cin>>x>>y;
        cout<<"我是构造函数我自豪"<<"我的位置就在"<<x<<y<<endl;
    }
    
    int Distance(int x,int y)
    {
        Position(x, y);
        return x*x+y*y;
    }
    ~Point()
    {
        cout<<"啊,我被删除了!"<<endl;
    }
};

class Rectangle:public Point
{
private:
    int row;
    int line;
    void Square(int row,int line)
    {
        cout<<"我的面积是:"<<line*row<<endl;
    }
    void Rec_Position(int x,int y)
    {
        cout<<"我的位置是:"<<x<<y<<endl;
    }
public:
    Rectangle(int x,int y,int row,int line):Point(x,y)
    {
        cout<<"我是矩形"<<line<<row<<endl;
    }
    
    void Rec_Distance(int x,int y)
    {
        cout<<Distance(x, y)<<endl;
    }
    
    void Rec_position(int x,int y)
    {
        cout<<x<<y<<endl;
    }
    
    ~Rectangle(){
        cout<<"啊,矩阵被删除了!"<<endl;
    }
    
};

运行结果是

被卡住了。而Rectangle的构造函数并没有赋值的地方,如果我们删去基类Point中构造函数里的赋值部分:

可以看出,在最终使用的时候,子类的对象其实是先调用基类的构造函数再使用自己的构造函数,析构的时候则是先自己再基类

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 类的构建,继承,派生上的小细节 的相关文章

随机推荐