C++中继承

继承性是面向对象编程中的一个重要特性,它允许一个类(派生类或子类)继承另一个类(基类或父类)的成员变量和成员函数,从而实现代码的复用和扩展。在 C++ 中,实现继承主要通过以下方式:

定义基类和派生类

  • 基类定义:首先定义一个基类,它包含了一些通用的成员变量和成员函数。例如:
cpp 复制代码
class Vehicle {
public:
    int wheels;
    void start() {
        cout << "Vehicle started." << endl;
    }
};
  • 派生类定义 :使用:符号和public、private或protected关键字来指定继承方式,然后定义派生类。例如:
cpp 复制代码
class Car : public Vehicle {
public:
    void drive() {
        cout << "Car is driving." << endl;
    }
};

继承的格式:子类 :继承方式 父类,比如 class A :public B 就表示 A 继承 B, 且为公有继承。

例如:pravite

cpp 复制代码
#include <iostream>
#include <vector>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
/*
成员属性:
private:私有的 只能在本类内访问
protected:受保护的 类内和子类访问
public:共有的 类内 子类 对象都可访问
*/
//继承只会缩小成员的权限,不会扩大成员的权限
class father {
public:
    int a;
protected:
    int b;
private:
    int c;
};
//私有的方式继承父类,父类中的所有成员在子类中都是私有的
class son:private father{

    void fun() {
    
        a = 1;
        b = 1;
        //c = 1;在父类中c是私有的所以不能在子类中访问
    }
};
//因为son以私有的方式继承了father,所以father中的成员在son中都是私有的,所以son的子类grandson不能访问a和b
class grandson :public son {
    void fun() {
    
       // a = 1;
       // b = 1;
    
    }


};
int main() {
    
    return 0;
}

多继承

cpp 复制代码
#include <iostream>
#include <vector>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
class father {
public:
    int a;


};
class father1 {
public:
   
    int a;

};
class son :public father ,public father1{
public:
    
    int a;

};


int main() {
    //多继承会产生二义性,用作用域进行解决
    son aa;
    aa.father::a;
    return 0;
}

菱形继承(钻石继承)

我们首先还是模拟一个菱形继承,Person类,Student类,Teacher类,Assistant类

但是我们在Student类和Teacher类继承Person类时,使用虚继承------关键字virtual

cpp 复制代码
#include <iostream>
#include <vector>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
class father {
public:
    int a;


};
class father1 : public father {
public:
   
    int a;

};
class father2 : public father {
public:

    int a;

};
class son :public father ,public father1,public father2{
public:
    
    int a;

};


int main() {
    //菱形继承也会产生二义性,通过作用域进行解决或者用关键字虚继承
    son bb;
    bb.father2::a;
    return 0;
}
相关推荐
wuminyu14 分钟前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++
qq_4069810321 分钟前
c++的decltype是什么
开发语言·c++
坤坤子吖27 分钟前
算法学习——单调队列
开发语言·c++·笔记·学习·算法
我就是全世界36 分钟前
OpenCode Go 套餐划算吗:先看你用哪个模型
开发语言·后端·golang
螺丝钉tina1 小时前
[Playwright] [02]常用命令与调试:Debug UI、Mode和 Trace Viewer
开发语言·javascript·测试工具·ui·自动化
杜 硕1 小时前
从零开始的C++生活——第六讲——01
开发语言·c++·生活
淡漠的蓝精灵1 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
乌暮2 小时前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring
এ慕ོ冬℘゜2 小时前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
其实防守也摸鱼2 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php