C++继承

文章介绍了C++中的继承机制,包括继承的概念,如派生类从基类继承属性和方法,以及重写功能。讨论了访问控制在继承中的作用,派生类如何访问基类的成员,并强调了构造函数、析构函数和友元函数的特殊情况。此外,还阐述了公有、保护和私有继承的差异,并给出了多继承的例子。最后,通过一个代码示例展示了如何创建和使用派生类。
摘要由CSDN通过智能技术生成

目录

一 继承简介

二 访问控制和继承

三 继承类型


一 继承简介

继承是根据另一个类来定义一个新的类,新的类除了继承原有类的属性方法外,可以新增自己的属性与方法,同时还可以对继承的方法进行重写,整体达到了重用代码的功能。已有的类称为基类,新建的类称为派生类。继承是 is a 的关系。

派生类可以继承多个基类,这意味着派生类便拥有了所继承的所有基类的属性和方法。

二 访问控制和继承

派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。访问权限总结如下:

访问

public

protected

private

同一个类

yes

yes

yes

派生类

yes

yes

no

外部的类

yes

no

no

一个派生类继承了所有的基类方法,但下列情况除外:

基类的构造函数、析构函数和拷贝构造函数。

基类的重载运算符。

基类的友元函数。

三 继承类型

当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:

公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。

保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。

私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。

多继承

多继承即一个子类可以有多个父类,它继承了多个父类的特性。

示例代码如下:

//
// Created by 11010 on 2023/4/8.
//

#ifndef CPP_10_INHERIT_COMPUTER_H
#define CPP_10_INHERIT_COMPUTER_H

#include <iostream>
#include <string>

using namespace std;

class computer {
public:
    string brand;  //品牌
    int storageSize; //内存大小
    int price; //价格
    computer(string brand="",int storageSize=0,int price=0); //构造函数不会被派生类继承
    ~computer(); //析构函数不会被派生类继承
    friend void friendComputer(computer cp);  //友元函数不会被派生类继承

    //提供private属性computerData的get和set方法
    void setComputerData(string data);
    string getComputerData();

protected:
    void printInfo(); //会被派生类继承

private:
    string computerData; //被private修饰,不会被基类继承
};


#endif //CPP_10_INHERIT_COMPUTER_H





//
// Created by 11010 on 2023/4/8.
//

#include "computer.h"

//使用初始化列表初始化变量
computer::computer(string brand, int storageSize, int price):
brand(brand),storageSize(storageSize),price(price){   }

//析构函数不会被派生类继承
computer::~computer() {

}

//友元函数也不会被派生类继承
void friendComputer(computer cp) {

}

//这个是public的方法,会被派生类继承
void computer::setComputerData(string data) {
    this->computerData=data;
}

//这个是public的方法,会被派生类继承
string computer::getComputerData() {
    return computerData;
}

//这个是protected修饰的方法,会被派生类继承
void computer::printInfo() {
  cout<<"电脑品牌:"<<brand<<",价格:"<<price<<",内存大小:"<<storageSize<<",电脑数据:"<<getComputerData()<<endl;
}





//
// Created by 11010 on 2023/4/8.
//

#ifndef CPP_10_INHERIT_IPHONE_H
#define CPP_10_INHERIT_IPHONE_H
#include <iostream>
#include <string>

using namespace std;

//手机类
class iphone {
public:
  string OSName;  //操作系统名称
  string MFName; //生成厂家名称

    void printInfo();
    iphone(string OSname="",string MFName="");


};


#endif //CPP_10_INHERIT_IPHONE_H





//
// Created by 11010 on 2023/4/8.
//

#include "iphone.h"

iphone::iphone(string OSname, string MFName):OSName(OSname),MFName(MFName) {

}

void iphone::printInfo() {
 cout<<"操作系统名称:"<<OSName<<",生产厂家:"<<MFName<<endl;
}

派生类

//
// Created by 11010 on 2023/4/8.
//

#ifndef CPP_10_INHERIT_USERNEED_H
#define CPP_10_INHERIT_USERNEED_H
#include <iostream>
#include <string>
#include "computer.h"
#include "iphone.h"

using namespace std;

//派生类UserNeed继承两个基类computer,iphone
class UserNeed:public computer,public iphone{

public:
    void printInfo(); //打印继承的基类信息
    UserNeed();
    /*
    //定义基类自己的属性、方法、构造方法、析构函数
    string name; //用户的姓名
    //手机信息
    string OSName;  //操作系统名称
    string MFName; //生成厂家名称
    //电脑信息
    string brand;  //品牌
    int storageSize; //内存大小
    int price; //价格



    UserNeed();

    //初始化自己的参数和父类的参数
    UserNeed(string name,string OSName,string MFName,string brand,int storageSize,int price);
    ~UserNeed();*/
};


#endif //CPP_10_INHERIT_USERNEED_H



//
// Created by 11010 on 2023/4/8.
//

#include "UserNeed.h"


void UserNeed::printInfo() {
    computer::printInfo();
}

UserNeed::UserNeed() {

}

/*
UserNeed::UserNeed(): computer(), iphone("hello","") {

}

UserNeed::UserNeed(string name, string OSName, string MFName, string brand, int storageSize, int price) {

}

UserNeed::~UserNeed() {

}
*/

主方法:

#include <iostream>
#include "UserNeed.h"
#include "iphone.h"
#include "computer.h"

int main() {

    UserNeed userNeed;
    //给继承的基类computer赋值
    userNeed.brand="levo";
    userNeed.price=12098;
    userNeed.storageSize=16;
    userNeed.setComputerData("这台电脑存储了1TB的用户数据");

    //给继承的基类iPhone成员赋值
   userNeed.OSName="linux";
   userNeed.MFName="HW";

   userNeed.printInfo();
   userNeed.printInfo();

   iphone i;
   i.OSName="ubuntu";
   i.MFName="XM";
   i.printInfo();

   computer cp;
    cp.brand="DJ";
    cp.price=12118;
    cp.storageSize=32;
    cp.setComputerData("这台电脑存储了100TB的用户数据");
    //cp.printInfo();  //不能访问,因为该方法只能被继承的类访问
    cout<<"电脑品牌:"<<cp.brand<<",价格:"<<cp.price<<",内存大小:"<<cp.storageSize<<",电脑数据:"<<cp.getComputerData()<<endl;

    std::cout << "Hello, World!" << std::endl;
    return 0;
}

代码clone地址:git@gitcode.net:XiaoWang_csdn/cpp_10_inherit.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值