QT学习C++(13)

本文详细介绍了C++中的继承机制,包括公有继承、保护继承和私有继承的特点。在公有继承中,父类的公有和保护成员在子类中分别保持原样,私有成员不可见;保护继承下,父类的公有成员变为保护,私有成员不可见;私有继承中,父类的公有和保护成员都变为私有。此外,还讨论了继承的优点、构造和析构的顺序,以及如何处理同名成员函数和静态成员。最后,提到了多继承可能导致的二义性问题及其解决方案——虚继承。
摘要由CSDN通过智能技术生成

继承和派生

 父类(基类),子类(派生类)

 

公有继承public(主导)

#include <iostream>

using namespace std;
class Net{
public:
    int a;
private:
    int b;
protected:
    int c;
};
class H1:public Net{
public:
    void show(){
        a = 11;
        cout << "a=" << a << endl;
//        b = 2; //不能访问
//        cout << "b=" << b << endl; //不能访问
        c = 33;
        cout << "c=" << c << endl;
    }
};

int main()
{
    H1 a;
    //公有继承:父类的公有在子类也是公有
    //可以通过外部和内部访问
    a.a = 1;
    cout << a.a << endl;
    a.show();
    //公有继承:父类的私有在子类不可见
    //外部和内部都不能访问
//    a.b = 2; //不能访问
//    a.show(); //不能访问
    //公有继承:父类的保护在子类也是保护
    //外部不能访问,内部能访问
//    a.c = 1; //不能访问
//    cout << a.c << endl; // 不能访问
    a.show();
    return 0;
}

 

公有继承:父类的私有数据在子类中不可见,其他数据保持原样

保护继承protected

#include <iostream>

using namespace std;
class Net{
public:
    int a;
private:
    int b;
protected:
    int c;
};
class H1:protected Net{
public:
    void show(){
        a = 11;
        cout << "a=" << a << endl;
//        b = 2; //不能访问
//        cout << "b=" << b << endl; //不能访问
        c = 33;
        cout << "c=" << c << endl;
    }
};

int main()
{
    H1 a;
    //公有继承:父类的公有在子类变为保护
    //可以通过外部不能访问,内部能访问
//    a.a = 1; //不能访问
//    cout << a.a << endl; //不能访问
    a.show();
    //公有继承:父类的私有在子类不可见
    //外部和内部都不能访问
//    a.b = 2; //不能访问
//    a.show(); //不能访问
    //公有继承:父类的保护在子类也是保护
    //外部不能访问,内部能访问
//    a.c = 1; //不能访问
//    cout << a.c << endl; // 不能访问
    a.show();
    return 0;
}

 

保护继承:父类的私有数据在子类中不可见,其他数据变为保护

私有继承private 

#include <iostream>

using namespace std;
class Net{
public:
    int a;
private:
    int b;
protected:
    int c;
};
class H1:private Net{
public:
    void show(){
        a = 11;
        cout << "a=" << a << endl;
//        b = 2; //不能访问
//        cout << "b=" << b << endl; //不能访问
        c = 33;
        cout << "c=" << c << endl;
    }
};

int main()
{
    H1 a;
    //公有继承:父类的公有在子类变为私有
    //可以通过外部不能访问,内部能访问
//    a.a = 1; //不能访问
//    cout << a.a << endl; //不能访问
    a.show();
    //公有继承:父类的私有在子类不可见
    //外部和内部都不能访问
//    a.b = 2; //不能访问
//    a.show(); //不能访问
    //公有继承:父类的保护在子类变为私有
    //外部不能访问,内部能访问
//    a.c = 1; //不能访问
//    cout << a.c << endl; // 不能访问
    a.show();
    return 0;
}

私有继承:父类的私有数据在子类中不可见,其他数据变为私有

 继承的优点:减少代码的冗余,提高代码的重用性

不管什么继承方式,父类中的私有数据在子类中不可见

继承的内层结构

子类构造和析构的顺序:(构造)父类构造-》子类构造;(析构)子类析构-》父类析构

子类中有父类和对象成员 构造和析构顺序:

 详解子类中的构造

实例化对象时,子类默认会调用

子类想要调用父类的有参构造,需显式调用(子类必须用初始化列表显式调用父类的有参构造)

父类和子类同名成员数据 处理 

 3.子类可以借助父类的公有方法间接的操作父类的数据

子类和父类同名成员函数

一旦子类实现父类同名成员函数 就会屏蔽父类中的所有同名函数

如果用户必须调用父类的同类成员函数,必须加作用域

继承中的静态成员特性

静态成员由所有成员对象共享

同名静态成员函数

 

多继承 

多继承容易产生:(二义性:父类之间出现同名) -》解决办法1:加作用域

 

菱形继承(具有公共祖先)解决方法2:采用虚基类

虚继承

 

 

 虚继承时会在子类产生额外的虚基类指针,虚基类指针指向虚基类表,虚基类表中存放data的偏移量

 

注:仅用于学习总结

QT学习C++(12)_爱吃糖葫芦的大熊的博客-CSDN博客

QT学习C++(14)_爱吃糖葫芦的大熊的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值