C++[第十章]--继承

文章介绍了C++中类的继承概念,包括继承的格式、访问控制(私有、保护、公有)、如何调整访问控制权限、派生类再派生时的注意事项,以及派生类函数的覆盖规则。同时,通过示例展示了派生类对象内存布局以及如何通过指针调用不同类的成员函数。
摘要由CSDN通过智能技术生成

继承

1、格式

// 基类
class Animal {
    // eat() 函数
    // sleep() 函数
};

//派生类
class Dog : 访问控制(private/protected/public) Animal {
    // bark() 函数
};

2、继承访问控制

1.不能直接拿父亲的私房钱:派生类不能访问基类的私有成员
2.可以问父亲要钱:通过protected/public的成员函数
3.儿子总是比外人亲:派生类可以访问父类的protected成员,其他代码不可以

3、调整访问控制

儿子继承来的财产,他可以捐给别人,也可以私藏(前提:Son看得见这些财产,即不是基类私有的):
Son可见到的成员,Son可以修改它的权限。
private: using Father::getMoney;

4、继承访问控制方式

1.无论哪种继承方式,在派生类内部使用父类时并无差别
2. 不同的继承方式,会影响这两方面:外部代码对派生类的使用、派生类的子类
在这里插入图片描述

5、派生类再派生

注意权限问题

6、派生类的函数

如果定义一个和基类一摸一样的函数,会用新的。

7、派生类对象的空间

money 基类部分 (Father)
toy 派生部分 (Son)

如果传入参数不是基类而是派生类,那么会传入派生类的基类部分

void test_func(Person &p)
{
	p.printInfo();
}

Person p("lisi", 16);

Student s;

test_func(p);
test_func(s); /* Person &p = s里面的Person部分;
                * p引用的是"s里面的Person部分"
	               */

例子:

#include <iostream>

using namespace std;

//基类
class A{
public:
    A(int a);
    int m_a;
public:
    void display();

};

A::A(int a):m_a(a) {}

void A::display() {
    cout<<"Class A:m_a="<<m_a<<endl;
}


//派生类
class B:public A{
public:
    B(int a1,int b);

public:
    void display();

protected:
    int m_b;
};

B::B(int a, int b):A(a),m_b(b) {}

void B::display() {

    cout<<"Class B:m_a="<<m_a<<", m_b"<<m_b<<endl;
}

class C{
public:
    C(int c);

public:
    void display();

protected:
    int m_c;

};

C::C(int c):m_c(c){}

void C::display() {

    cout<<"Class C: m_c="<<m_c<<endl;
}


class D:public B,public C{
public:
    D(int a,int b,int c,int d);

public:
    void display();

private:
    int m_d;

};

D::D(int a, int b, int c, int d) :B(a,b),C(c),m_d(d){}

void D::display() {
    cout<<"Class D: m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl;
}

int main(){
    A *pa =new A(1);                   //基类
    B *pb =new B(2,20);                //从A继承
    C *pc =new C(3);                   //基类
    D *pd =new D(4,40,400,4000);       //从B C继承

    cout<<"-----------------------start"<<endl;
    cout<<"pa="<<pa<<endl;
    cout<<"pb="<<pb<<endl;
    cout<<"pc="<<pc<<endl;
    cout<<"pd="<<pd<<endl;

    pa=pd;
    pa ->display();

    pb=pd;
    pb ->display();

    pc=pd;
    pc ->display();

    cout<<"-----------------------"<<endl;
    cout<<"pa="<<pa<<endl;
    cout<<"pb="<<pb<<endl;
    cout<<"pc="<<pc<<endl;
    cout<<"pd="<<pd<<endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起风就扬帆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值