c++学习笔记3,继承

一个类可以继承一个或多个类,这个类叫派生类,被继承的叫基类

cpp 复制代码
class A{
};
class B{
};
class C{
};
class myclass :private A,protect B,public C//继承方式 类,多继承时之间用逗号间隔
{
}

继承方式决定对基类成员的访问权限,基类的私有变量方法派生类不可访问,其他的按派生类与基类的访问范围取最小范围,比如基类protect方法,派生类继承方式为private,则在派生类内为private方法。

覆盖,派生类允许对同名成员进行覆盖,编译器会自动隐藏,但仍然存在,如果需要用到被覆盖的基类成员,需要使用作用域运算符区分,

cpp 复制代码
class A {
public;
int i;
};
class B public A{

int i;
B(){
i=9;
A::i=0;}
public:
void show (){
cout<< i<<" " << A::i<<endl; 
};

构造,派生类在构造时顺序是先基类后派生,析构相反,如果基类的方法缺省,派生类可以缺省。

继承时构造调用方法如下,格式 构造函数 (参数列表):基类构造(传参),... 。多继承时构造函数使用单逗号分隔。

cpp 复制代码
class cbas
{
public:
    cbas(int i)
    {
    }
    void func()
    {
        cout << "bas" << endl;
    }
};
class ctmp
{
public:
    ctmp(int i)
    {
    }
};
class cdcv : public cbas, public ctmp
{

public:
    cdcv(int i, int j) : cbas(i), ctmp(j)
    {
    }
    void func()
    {
        cout << "cdcv" << endl;
    }
    void func(int i)
    {
        cout << i << endl;
    }
};

指针和引用,允许基类指向或者引用派生类,派生类无法指向或引用基类,但是只能使用基类的方法和成员,因为在编译阶段就会按照指针或者引用的类型进行绑定,如果要实现指针指向的对象不同而使用不同方法,需要用到虚函数。

cpp 复制代码
#include <iostream>
using namespace std;
class cbas
{
public:
    void func()
    {
        cout << "bas" << endl;
    }
};
class cdcv : public cbas
{
public:
    void func()
    {
        cout << "cdcv" << endl;
    }
    void func(int i)
    {
        cout << i << endl;
    }
};
void func(int i = 0, int j = 9)
{
    cbas a;
    a.func();
    cdcv b;
    b.func();
    cbas *p = &a;//基类指针初始指向基类
    p->func();
    p = &b;//然后指向派生类
    p->func();
    cbas &r = b;//基类引用派生类
    r.func();
    cbas *v = &b;//派生类初始指向派生类
    v->func();
    cdcv &s = b;
    s.func();
}
int main()
{
    func(1);
    system("pause"); // 用于在Windows系统上暂停程序,防止控制台窗口关闭
    return 0;        // 返回0表示程序正常退出
}

虚函数用于解决上面的静态绑定问题,实现动态绑定。使用方法,在函数前加virtual,这样就可以使用基类指针调用派生类覆盖的方法。注意基类指针只能调用基类的方法,所以不能调用重载的方法。

cpp 复制代码
#include <iostream>
using namespace std;
class cbas
{
public:
    cbas(int i)
    {
    }
    virtual void func()
    {
        cout << "bas" << endl;
    }
};
class cdcv : public cbas
{

public:
    cdcv(int i, int j) : cbas(i)
    {
    }
    void func()
    {
        cout << "cdcv" << endl;
    }
    void func(int i)
    {
        cout << i << endl;
    }
};
void func(int i = 0, int j = 9)
{
    cbas a(1);
    a.func();
    cdcv c(i, j);
    c.func();
    cbas *p = &a;
    p->func();
    p = &c;
    p->func();
    //  p->func(i);//不属于基类,不能调用重载的方法
}
int main()
{
    func(1);
    system("pause"); // 用于在Windows系统上暂停程序,防止控制台窗口关闭
    return 0;        // 返回0表示程序正常退出
}
相关推荐
_李小白几秒前
【Android Gradle学习笔记】第八天:NDK的使用
android·笔记·学习
摇滚侠28 分钟前
Spring Boot 3零基础教程,WEB 开发 自定义静态资源目录 笔记31
spring boot·笔记·后端·spring
摇滚侠29 分钟前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 遍历 笔记40
spring boot·笔记·thymeleaf
沐怡旸1 小时前
【穿越Effective C++】条款02:尽量以const, enum, inline替换#define
c++·面试
给大佬递杯卡布奇诺1 小时前
FFmpeg 基本API avcodec_alloc_context3函数内部调用流程分析
c++·ffmpeg·音视频
Jose_lz1 小时前
C#开发学习杂笔(更新中)
开发语言·学习·c#
Chloeis Syntax1 小时前
接10月12日---队列笔记
java·数据结构·笔记·队列
QT 小鲜肉1 小时前
【个人成长笔记】Qt 中 SkipEmptyParts 编译错误解决方案及版本兼容性指南
数据库·c++·笔记·qt·学习·学习方法
A9better2 小时前
嵌入式开发学习日志41——stm32之SPI总线基本结构
stm32·单片机·嵌入式硬件·学习
看到我,请让我去学习2 小时前
Qt 控件 QSS 样式大全(通用属性篇)
开发语言·c++·qt