C++类基础(十三)

文章介绍了C++中的类继承机制,包括public和private继承的差异,protected限定符的作用,以及如何通过基类指针或引用操作派生类对象。同时讨论了静态类型和动态类型的区别,并展示了如何在派生类中访问和调用基类的成员及构造函数。
摘要由CSDN通过智能技术生成

类的继承
● 通过类的继承(派生)来引入“是一个”的关系( 17.2 — Basic inheritance in C++
在这里插入图片描述

– 通常采用 public 继承( struct V.S. class )
– 注意:继承部分不是类的声明
– 使用基类的指针或引用可以指向派生类对象

struct Base
{

};
struct Base2 : Base
{
    
};

struct Derive : Base2 //注意,不是声明,该语句等价于struct Derive : public Base,即struct缺省继承方式为public
//class Derive : Base2 //等价于class Derive : private Base,即class缺省继承方式为private
{

};

int main()
{
    Derive d;
    Base& ref = d; //OK
    Base* ptr = &d; //OK
}

– 静态类型 V.S. 动态类型

struct Base
{
    void funBase() {} //静态类型
};
struct Base2 : Base
{
    void funBase2() {} //静态类型
};
struct Derive : Base2
{
    void funDerive() {} //静态类型
};
struct Derive2 : Base2
{
    void funDerive2() {} //静态类型
};
int main()
{
    Derive d;
    Derive2 d2;
    Base& ref = d; //静态类型: 即编译期就能决定的类型且不能改变
    Base* ptr = &d; //动态类型
    ref.funBase(); //OK,静态类型没有改变
    ref.funDerive(); //静态类型不能发生改变,Error: No member named 'funDerive' in 'Base'
    ptr = &d2; //OK,动态类型可以在运行期发生改变
    return 0;
}

– protected 限定符:派生类可访问

struct Base
{
private:
    void funBase() {}
};
struct Derive : Base
{
    void funDerive()
    {
        funBase(); //Error: 'funBase' is a private member of 'Base'
    }
};
int main()
{
    Base b;
    b.funBase(); //Error: 'funBase' is a private member of 'Base'
    return 0;
}
struct Base
{
    void funBase() {}
};
struct Derive : Base
{
    void funDerive()
    {
        funBase(); //OK
    }
};
int main()
{
    Base b;
    b.funBase(); //OK

    Derive d;
    d.funBase(); //OK
    d.funDerive(); //OK
    return 0;
}
struct Base
{
protected:
    void funBase() {}
};
struct Derive : Base
{
    void funDerive()
    {
        funBase(); //OK
    }
};
int main()
{
    Base b;
    b.funBase(); //Error: 'funBase' is a protected member of 'Base'
    
    Derive d;
    d.funBase(); //Error: 'funBase' is a protected member of 'Base'
    d.funDerive(); //OK
    return 0;
}

● 类的派生会形成嵌套域
– 派生类所在域位于基类内部
– 派生类中的名称定义会覆盖基类

struct Base
{
    int val = 2;
};
struct Derive : Base
{
    void funDerive()
    {
        std::cout << val << std::endl;
    }
    int val = 3;
};
int main()
{
    Derive d;
    d.funDerive();
    return 0;
}

在这里插入图片描述

struct Base
{
    int val = 2;
};
struct Derive : Base
{
    void funDerive()
    {
        std::cout << val << std::endl;
    }
    //int val = 3;
};
int main()
{
    Derive d;
    d.funDerive();
    return 0;
}

在这里插入图片描述

– 使用域操作符显式访问基类成员

struct Base
{
    int val = 2;
};
struct Derive : Base
{
    void funDerive()
    {
        std::cout << val << std::endl;
        std::cout << Base::val << std::endl;
    }
    int val = 3;
};
int main()
{
    Derive d;
    d.funDerive();
    return 0;
}

在这里插入图片描述

– 在派生类中调用基类的构造函数

struct Base
{
    Base()
    {
        std::cout << "Base()\n";
    }
};
struct Derive : Base
{
    Derive()
    {
        std::cout << "Derive()\n";
    }
};
int main()
{
    Derive d;
    return 0;
}

在这里插入图片描述

struct Base
{
    Base(int)
    {
        std::cout << "Base()\n";
    }
};
struct Derive : Base
{
    Derive(int a) //缺省构造函数调用基类的缺省构造函数,Error: Constructor for 'Derive' must explicitly initialize the base class 'Base' which does not have a default constructor
    {
        std::cout << "Derive()\n";
    }
};
int main()
{
    Derive d;
    return 0;
}
struct Base
{
    Base(int)
    {
        std::cout << "Base()\n";
    }
};
struct Derive : Base
{
    Derive(int a) //缺省构造函数调用基类的缺省构造函数,Error: Constructor for 'Derive' must explicitly initialize the base class 'Base' which does not have a default constructor
        : Base(a) //显式调用基类的构造函数
    {
        //Base::Base(a); //Error: Qualified reference to 'Base' is a constructor name rather than a type in this context
        std::cout << "Derive()\n";
    }
};
int main()
{
    Derive d(2);
    return 0;
}

在这里插入图片描述

参考
深蓝学院: C++基础与深度解析
17.2 — Basic inheritance in C++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值