继承用法大全——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

相关文章
|
19天前
|
Java C++
C++的学习之路:21、继承(2)
C++的学习之路:21、继承(2)
18 0
|
3天前
|
安全 前端开发 Java
【C++】从零开始认识继承二)
在我们日常的编程中,继承的应用场景有很多。它可以帮助我们节省大量的时间和精力,避免重复造轮子的尴尬。同时,它也让我们的代码更加模块化,易于维护和扩展。可以说,继承技术是C++的灵魂。
10 1
|
3天前
|
安全 程序员 编译器
【C++】从零开始认识继承(一)
在我们日常的编程中,继承的应用场景有很多。它可以帮助我们节省大量的时间和精力,避免重复造轮子的尴尬。同时,它也让我们的代码更加模块化,易于维护和扩展。可以说,继承技术是C++的灵魂。
19 3
【C++】从零开始认识继承(一)
|
19天前
|
安全 编译器 程序员
c++的学习之路:20、继承(1)
c++的学习之路:20、继承(1)
29 0
|
1月前
|
人工智能 机器人 测试技术
【C++】static_cast基本用法(详细讲解)
【C++】static_cast基本用法(详细讲解)
|
2天前
|
存储 编译器 C++
C++中的继承
C++中的继承
9 0
|
4天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
9 0
|
5天前
|
安全 程序员 编译器
【C++】继承(定义、菱形继承、虚拟继承)
【C++】继承(定义、菱形继承、虚拟继承)
13 1
安全 编译器 程序员
10 1
|
10天前
|
安全 程序员 C++
C++ new和delete的用法
需要注意的是,使用 `new`和 `delete`分配和释放内存时,程序员负责管理内存的分配和释放,这可能导致内存泄漏或释放已释放内存的问题。因此,C++引入了智能指针(如 `std::shared_ptr`和 `std::unique_ptr`)以更安全和自动化地管理内存。
34 2