[C++] 八 透传、委托、继承及三种权限介绍

继承的基本使用

继承是C++的三大特性之一,体现的是代码复用的思想
所谓继承就是在一个已经存在的类的基础上,建立一个新的类,让新的类拥有之前的类的特性
已经存在的类叫做“基类”或“父类”
新建立的类被称为“派生类”或“子类”
通常派生类继承基类后,会对基类代码进行一定程序的扩充或改动
如果对继承来的基类成员函数不满意,可以使用函数隐藏来屏蔽基类同名函数。如果对于继承来的成员变量不满意,可以直接修改

#include <iostream>

using namespace std;

class Father
{
   
public:
    string F_name = "zhang";

    void work()
    {
   
        cout << "I'm a worker" << endl;
    }
};

class Son:public Father
{
   
public:
    void work()
    {
   
        cout << "鸡你太美" << endl;
    }
    void play()
    {
   
        cout << "巴拉巴拉" << endl;
    }
};

int main()
{
   
    Son s;
    //更改继承来的成员变量
    s.F_name = "wang";
      s.work();
    // 除了可以调用上述继承来的特性外,还可以调用自己的部分
    s.play();
    // 可以使用下面的方式调用被隐藏的基类函数
    s.Father::work();
    
    return 0;
}

注意:基类和派生类是相对的。
派生类是基类的具象化,基类是派生类的抽象化

关于基类的private成员的说明
派生类可以继承到基类private的成员,只是无法直接访问

#include <iostream>

using namespace std;

class Father
{
   
private:
    string first_name = "张";

public:
    void set_first_name(string fn)
    {
   
        first_name = fn;
    }

    string get_first_name() const
    {
   
        return first_name;
    }
};

// Son类继承自Father类
class Son:public Father
{
   
public:

};

int main ()
{
   
    Son s;
    cout << s.get_first_name() << endl; // 张
    s.set_first_name("王");
    cout << s.get_first_name() << endl; // 王

    return 0;
}

#构造函数和析构函数不能被继承
在上面代码中Father类没有手动写构造函数,因此编译器会自动添加一个没有参数的、函数体为空的构造函数。Son类中也没有手动写构造函数,编译器也会自动添加一个没有参数的、函数体为空的构造函数,且在Son类的构造函数中调用基类的构造函数。
如果在派生类中调用基类的构造函数,这种用法被称为透传构造
在继承中,每一个派生类的任意一个构造函数都必须直接或间接调用基类的任意一个构造函数
一个类的构造函数去调用其他构造函数的方式有三种:透传构造、委托构造、继承构造

透传构造

透传构造指的是在派生类的构造函数中调用基类的构造函数

#include <iostream>

using namespace std;

class Father{
   
private:
	string name;
public:
	Father(string fn):name(fn){
   }
	
	string get_name() const
	{
   
		return name;
	}
};
//Son类继承自Father类
class Son:public Father
{
   
public:
//    Son():Father(){} 编译器默认添加
    Son():Father("张"){
   }

    Son(string name):Father(name){
   }
};


int main ()
{
   
    Son s;
    cout << s.get_name() << endl;

    Son s2("王");
    cout << s2.get_name() << endl;

    return 0;
}

委托构造

委托构造指的是一个类的构造函数调用这个类的另一个构造函数,需要注意的是:不得形成委托闭环、最终委托的构造函数需要透传构造

#include <iostream>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值