继承用法大全——c++面向对象编程(必看)

简介: 继承用法大全——c++面向对象编程(必看)

好了,今天我们来看c++面向对象编程之继承,都坐好了,秋名山码神发车了,基操勿6
一:继承的基本框架及优点:
儿子继承父亲。。
继承的好处:可以减少重复的代码

*class A : public B;
A 类称为子类 或 派生类
B 类称为父类 或 基类*

派生类中的成员,包含两大部分:
一类是从基类继承过来的,一类是自己增加的成员。
从基类继承过过来的表现其共性,而新增的成员体现了其个性。

继承的语法:class 子类 : 继承方式 父类
下面是继承的一段c++代码

class Base1
{
public: 
    int m_A;
protected:
    int m_B;
private:
    int m_C;
};

//公共继承
class Son1 :public Base1
{
public:
    void func()
    {
        m_A; //可访问 public权限
        m_B; //可访问 protected权限
        //m_C; //不可访问
    }
};

void myClass()
{
    Son1 s1;
    s1.m_A; //其他类只能访问到公共权限
}

//保护继承
class Base2
{
public:
    int m_A;
protected:
    int m_B;
private:
    int m_C;
};
class Son2:protected Base2
{
public:
    void func()
    {
        m_A; //可访问 protected权限
        m_B; //可访问 protected权限
        //m_C; //不可访问
    }
};
void myClass2()
{
    Son2 s;
    //s.m_A; //不可访问
}

//私有继承
class Base3
{
public:
    int m_A;
protected:
    int m_B;
private:
    int m_C;
};
class Son3:private Base3
{
public:
    void func()
    {
        m_A; //可访问 private权限
        m_B; //可访问 private权限
        //m_C; //不可访问
    }
};
class GrandSon3 :public Son3
{
public:
    void func()
    {
        //Son3是私有继承,所以继承Son3的属性在GrandSon3中都无法访问到
        //m_A;
        //m_B;
        //m_C;
    }
};

总的来说就是,公共的父类继承随子类,私有的不会变,保护的随机应变,子类私有全私有。
二:同名时的处理

  1. 变量同名
  2. 函数同名
#include<iostream>
using namespace std;
class Base
{
public:
    Base()
    {
        m_A = 100;
    }
    int m_A;
    void func()
    {
        cout << "Bace func的调用" << endl;
    }
};
class Son :public Base
{
public:
    Son()
    {
        m_A = 200;
    }
    int m_A;
    void func()
    {
        cout << "Son func的调用" << endl;
    }
};
void text01()
{
    Son s;
    cout << s.m_A << endl;
    cout << s.Base::m_A << endl;//加作用域
}
void text02()
{
    Son s;
    s.func();
    s.Base::func();
}
int main()
{
    text01();
    text02();
    system("pause");
    return 0;
}

三.静态成员同名时的处理

#include<iostream>
using namespace std;
class Base
{
public:
    static void func()
    {
        cout << "Base static func" << endl;
    }
    static int m_A;
    static void func(int m_A)//函数重载
    {
        cout << "Base static m_A" << endl;
    }

};
int Base::m_A = 200;
class Son :public Base
{
public:
    static void func()
    {
        cout << "Son static func" << endl;
    }
    static int m_A;
};
int Son::m_A = 100;
void text01()
{
    //对象访问
    Son s;
    cout << "Base" << s.Base::m_A << endl;
    cout << "Son" << s.m_A << endl;
    //类名直接
    cout << "Base" << Son::Base::m_A << endl;
    cout << "Son" << Son::m_A << endl;
    
}
void text02()
{
    Son s;
    s.func();
    s.Base::func();
    Son::func();
    Son::Base::func();
}
int main()
{
    text01();
    text02();
    system("pause");
    return 0;
}

可以看出静态成员同名时有俩种处理方式,但是记住:
无论是什么同名处理,用::作用域一定可以处理
四:下面我们来看一下继承中父类与子类的顺序
提到顺序,不难想到函数的,构造与析构

#include<iostream>
using namespace std;
class Base
{
public:
    Base()
    {
        cout << "父类构造函数" << endl;
    }
    ~Base()
    {
        cout << "父类析构函数" << endl;
    }
};
class Son :public Base
{
public:
    Son()
    {
        cout << "子类构造函数" << endl;
    }
    ~Son()
    {
        cout << "子类析构函数" << endl;
    }
};
void test01()
{
    //继承中先调用父类构造,再是子类构造
    //先是父类析构,再是子类析构
    Son s;
}
int main()
{
    test01();
    system("pause");
    return 0;
}

这里有点父类有点像栈的先进后出
五.多继承(但在实际开发中不建议使用)

#include<iostream>
using namespace std;
class Base1
{
public:
    Base1()
    {
        m_A = 100;
    }
    int m_A;
};
class Base2
{
public:
    Base2()
    {
        m_B = 200;
    }
    int m_B;
};
class Son :public Base1, public Base2
{
public:
    Son()
    {
        m_C = 300;
        m_D = 400;
    }
    int m_C, m_D;
};
void text01()
{
    Son s;
    cout << "son is size:" << sizeof(Son) << " " << sizeof(s) << endl;
    //16
    cout << s.Base1::m_A;
}
int main()
{
    text01();
    system("pause");
    return 0;
}

从代码中我们可以看出多继承的语法是
class Son :public Base1, public Base2
用“ ,”格开,其中子类Son,自身有俩个int为8,但是它又继承了俩个父类的int,所以输出为16

相关文章
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
81 11
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
1月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
39 1
|
1月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
18 0
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
30 0
|
1月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
32 0
|
2月前
|
C++
C++(二十)继承
本文介绍了C++中的继承特性,包括公有、保护和私有继承,并解释了虚继承的作用。通过示例展示了派生类如何从基类继承属性和方法,并保持自身的独特性。此外,还详细说明了派生类构造函数的语法格式及构造顺序,提供了具体的代码示例帮助理解。
|
2月前
|
C++
c++继承层次结构实践
这篇文章通过多个示例代码,讲解了C++中继承层次结构的实践应用,包括多态、抽象类引用、基类调用派生类函数,以及基类指针引用派生类对象的情况,并提供了相关的参考链接。
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
3月前
|
C++
拥抱C++面向对象编程,解锁软件开发新境界!从混乱到有序,你的代码也能成为高效能战士!
【8月更文挑战第22天】C++凭借其强大的面向对象编程(OOP)能力,在构建复杂软件系统时不可或缺。OOP通过封装数据和操作这些数据的方法于对象中,提升了代码的模块化、重用性和可扩展性。非OOP方式(过程化编程)下,数据与处理逻辑分离,导致维护困难。而OOP将学生信息及其操作整合到`Student`类中,增强代码的可读性和可维护性。通过示例对比,可以看出OOP使C++代码结构更清晰,特别是在大型项目中,能有效提高开发效率和软件质量。
34 1