c++—继承、继承方式

这篇具有很好参考价值的文章主要介绍了c++—继承、继承方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. c++三大核心功能

    (1)封装:提高代码的维护性,遇到问题可以准确定位;

    (2)继承:提高代码的复用性,注意不是ctrl+c,ctrl+v,而是不做任何修改或操作源码就能实现代码的复用;

    (3)多态:提高代码的扩展性;

2. 代码复用的两种方式

    (1)组合(has-a),在一个B类的内部,定义一个A类的实例化成员,这样就可以调用A类里面的成员或者方法;

        优点:方便操作,逻辑清晰,安全;

        缺点:要在B类中实例化很多其他类的成员,导致占用的内存很大;

#include <iostream>

using namespace std;

class A
{
public:
    void print()
    {
        cout<<"hello world"<<endl;
    }

    int m_num;
};

class B
{
public:
    A a;  //组合的方式实现代码复用
    void print()
    {
        a.print();
    }

    int m_len; 
};

int main(int argc, char **argv)
{
    B b;
    b.print();



    return 0;
}

    (2)继承(is-a),子类继承父类,或派生类继承基类;注意基类与派生类之间是相互独立的空间,不是共享成员;派生类的实例化对象的大小=基类对象的大小+派生类成员的大小;

        覆盖:当派生类拥有与基类相同的属性或者方法时,派生类会覆盖继承过来的属性与方法,空间还是增加的,不会不变;

        一共有三种继承方式,实际工程应用中只用public方式:

继承方式 基类中的public成员 基类中protect成员 基类中private成员
public公有继承 在派生类的内外均可见 在派生类内部可见,外部不可见 在派生类内外均不可见
protect保护继承 在派生类的内部可见,外部不可见
private私有继承 在派生类的内部可见,外部不可见 在派生类内外均不可见
#include <iostream>

using namespace std;

class A
{
public:
    void print()
    {
        cout<<"hello world"<<endl;
    }

    int m_num;
private:
    int m_index;
};

class B : private A
{
public:
    void test()
    {
        cout<<"A::m_num = "<<m_num<<endl;  //私有继承,只可以在派生类的内部查看,且只可以查看基类的公有成员;
        print();  //基类的公有函数也可以在类内查看;
    }


    int m_len; 
};

int main(int argc, char **argv)
{
    B b;
    b.test();

    return 0;
}

    (3)基类与派生类

           派生类的构造函数:派生类从基类继承的成员还是要基类的构造函数初始化完成,派生类新增的成员,就在派生类的构造函数中初始化;具体执行顺序如下:

        ①如果派生类中含有其他类的实例化对象,就是说成员对象,那么构造函数的执行顺序:基类→成员对象→派生类构造函数;析构函数则相反;

        ②如果基类中没有无参构造函数(例如,只有有参的,那么这是系统提供的默认无参构造函数就失效了,需要自己写一个基类的无参构造函数),那么派生类里所有的构造函数都要显是调用基类的构造函数(例如自定义有参构造函数等);

        ③若一个派生类继承了多个基类,那么基类中的构造函数执行顺序与其继承顺序相关(即public的前后顺序);

        ④若要调用内嵌的成员对象的构造函数是,执行顺序按照它们在类中的声明顺序执行;

     (4)函数遮蔽

        就是指派生类中有与基类重名的函数,相当于重载了基类中的函数方法,系统优先调用派生类自己的函数,如需要调用基类中的函数,需要加作用域限定符;总之就是如需要调用基类的一些函数,包括普通成员函数、拷贝构造函数、移动拷贝构造函数等,都需要显式调用(第一个加作作用域限定符,后两个加显示调用,跟在派生类的对应构造函数后面);

示例:

#include <iostream>

using namespace std;

class A
{
public:
    A()
    {
        cout<<"A"<<endl;
    }

    A(int num):m_num(num)
    {
        cout<<"A int"<<endl;
    }

    void print()
    {
        cout<<"hello world"<<endl;
    }

    ~A()
    {
        cout<<"~A"<<endl;
    }

// private:
    int m_num;
    int m_index;
};

class B : public A
{
public:
    B():A()  //派生类中的构造函数都要显式调用基类的构造函数;
    {
        cout<<"B"<<endl;
    }

    B(int len):m_len(len),A(len)  //派生类中的构造函数都要显式调用基类的构造函数;
    {
        cout<<"B int"<<endl;
    }

    void print()
    {
        cout<<"hi world"<<endl;
    }

//private:
    int m_len; 
};

int main(int argc, char **argv)
{
    B b1;
    B b2(5);

    b1.print();
    b1.A::print();  //B类中与基类中函数重名,发生了函数遮蔽/函数覆盖,若要调用基类的函数,需要作用于限定符;

    cout<<b2.m_num<<endl;

    return 0;
}

    (5)多继承:在D类访问最原始的基类A中的成员时,容易出现二义性;所以引入了虚继承,这时B和C类里面都有一个续表指针,最终D类在构造函数的时候需要,需要显式调用A类的构造函数;如果B类和C类没有引入虚继承,那么D类访问A类的成员需要作用域限定符,表明走B这边,还是走C这里;

c++—继承、继承方式文章来源地址https://www.toymoban.com/news/detail-463270.html

#include <iostream>

using namespace std;

class A
{
public:
    A(int a): m_a(a)
    {
        cout<<"A"<<endl;
    }

    int m_a;
};

class B : virtual public A
{
public:
    B(int b): m_b(b),A(2)
    {
        cout<<"B"<<endl;
    }

    int m_b;
};

class C : virtual public A
{
public:
    C(int c): m_c(c),A(3)
    {
        cout<<"C"<<endl;
    }

    int m_c;
};

class D : public B, public C
{
public:
    D(int d): m_d(d),B(2),C(3),A(7)  //B和C都是虚继承,那么D这里需要显式调用A的构造函数
    {
        cout<<"D"<<endl;
    }

    int m_d;
};

int main(int argc, char **arg)
{

    D d(4);
    cout<<d.m_a<<endl;  //这里就不用作用域限定符了
    cout<<d.B::m_a<<endl;  //如果B/C没有采用虚继承,则需要作用域限定符

    return 0;
}

到了这里,关于c++—继承、继承方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图书管理借阅系统【Java简易版】Java三大特征封装,继承,多态的综合运用

    前言 前几篇文章讲到了Java的基本语法规则,今天我们就用前面学到的数组,类和对象,封装,继承,多态,抽象类,接口等做一个图书管理借阅系统。 Java语言是面向对象的,所以首先要分析完成这个图书管理系统,有哪些对象: 👱使用者User 📘书Book 📲操作Operation 使用者

    2024年02月14日
    浏览(41)
  • Python的类与对象、构造方法、类与对象三大特性封装、继承和多态、类型注解

      使用对象组织数据 在程序中是可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的。 在程序中设计表格,我们称之为: 设计类(class) class Student: name None #记录学生姓名 在程序中打印生产表格,我们称之为: 创建对象 #基于类创建对象 stu_1 Student() stu_2 St

    2024年02月02日
    浏览(54)
  • C++三大特性—继承“复杂的菱形继承及菱形虚拟继承”

    C++的一个大坑:菱形继承 希望这篇文章能让你理解什么是菱形继承,以及菱形继承的注意事项 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承  java语言不支持多继承,只支持单继承。 菱形

    2024年02月03日
    浏览(42)
  • C++三大特性之一:继承

    C++三大特性:继承、多态和封装。继承是面向对象编程的一个核心概念,它允许我们根据一个已存在的类(基类或者叫父类),创建一个新的类(派生类或者叫子类),这个新的类继承了类的属性和行为。 1.继承格式。 class 子类名 :继承属性(publicprotectedprivate)父类名{

    2024年04月25日
    浏览(27)
  • C++ 面向对象三大特性——继承

    ✅1主页:我的代码爱吃辣 📃2知识讲解:C++ 继承 ☂️3开发环境:Visual Studio 2022 💬4前言:面向对象三大特性的,封装,继承,多态,今天我们研究研究 C++的继承 。 目录 一.继承的概念及定义 1.继承的概念  2.继承的定义 二. 继承关系和访问限定符  三.基类和派生类对象赋

    2024年02月12日
    浏览(66)
  • 【C++】三大特性 --- 继承的详细讲解

    目录 1.继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚拟继承 8.继承的

    2024年02月05日
    浏览(46)
  • 面向对象的三大特性之继承(C++)

    概念   继承机制是面向对象编编程使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。 定

    2024年02月06日
    浏览(49)
  • 【C++庖丁解牛】面向对象的三大特性之一多态 | 抽象类 | 多态的原理 | 单继承和多继承关系中的虚函数表

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 需要声明的,本节课件中的代码及解释都是在vs2013下的x86程序中,涉及的指针都是4bytes。如果要其他平台

    2024年04月10日
    浏览(56)
  • c++面向对象之封装、继承、和多态

    把客观事物封装成类,而且可以把自己的数据和方法设置为只能让可信的类或者对象操作,对不可信的信息进行隐藏(利用public,private,protected,friend)实现 has-a :描述一个类由多个部件类构成,一个类的成员属性是另一个已经定义好的类。 use-a:一个类使用另一个类,通过类之间

    2024年02月02日
    浏览(48)
  • c++—继承、继承方式

    1. c++三大核心功能     (1)封装:提高代码的维护性,遇到问题可以准确定位;     (2)继承:提高代码的复用性,注意不是ctrl+c,ctrl+v,而是不做任何修改或操作源码就能实现代码的复用;     (3)多态:提高代码的扩展性; 2. 代码复用的两种方式     (1)组合(ha

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包