c++ QT从零保姆级教程

一 C++语法

1.1 c++中Public/Private/Protected变量的继承

publicprivateprotected是C++中的访问修饰符,用来指定类成员的访问权限。

  • public:成员在任何地方都是可访问的。
  • private:成员只能被类的成员函数、友元函数或类的实例访问。
  • protected:成员只能被类的成员函数、友元函数、派生类的成员函数或派生类的实例访
    #include <iostream>  
    using namespace std;  
      
    // 基类  
    class Base {  
    public:  
        int publicData; // 公有成员  
    protected:  
        int protectedData; // 保护成员  
    private:  
        int privateData; // 私有成员  
    };  
      
    // 派生类  
    class Derived : public Base {  
    public:  
        void accessMembers() {  
            publicData = 1; // 直接访问公有成员  
            protectedData = 2; // 直接访问保护成员  
            // privateData = 3; // 错误!无法直接访问私有成员  
        }  
    };  
      
    int main() {  
        Derived d;  
        d.publicData = 5; // 正确:公有成员在类外可访问  
        // d.protectedData = 6; // 错误:保护成员在类外不可访问  
        // d.privateData = 7; // 错误:私有成员在类外不可访问  
        return 0;  
    }

    在这个例子中,Derived类继承自Base类。Derived类的成员函数accessMembers可以访问Base类的公有成员和保护成员,但不能直接访问私有成员。在main函数中,我们只能访问Derived对象的公有成员,不能访问保护成员和私有成员。

1.2 c++中Public/Private/Protected成员函数的继承

成员函数的继承访问是非常灵活和复杂的,请看下面的示例:

#include <iostream>  
using namespace std;  
  
// 基类  
class Base {  
public:  
    void publicFunc() {  
        cout << "Public function in Base." << endl;  
    }  
protected:  
    void protectedFunc() {  
        cout << "Protected function in Base." << endl;  
    }  
private:  
    void privateFunc() {  
        cout << "Private function in Base." << endl;  
    }  
};  
  
// 派生类,使用public继承  
class DerivedPublic : public Base {  
public:  
    void accessMembers() {  
        publicFunc();    // 可以访问公有成员函数  
        protectedFunc(); // 可以访问保护成员函数  
        // privateFunc(); // 错误!无法访问私有成员函数  
    }  
};  
  
// 派生类,使用protected继承  
class DerivedProtected : protected Base {  
public:  
    void accessMembers() {  
        publicFunc();    // 可以访问公有成员函数,但在DerivedProtected外部将不可访问  
        protectedFunc(); // 可以访问保护成员函数  
        // privateFunc(); // 错误!无法访问私有成员函数  
    }  
};  
  
// 派生类,使用private继承  
class DerivedPrivate : private Base {  
public:  
    void accessMembers() {  
        publicFunc();    // 可以访问公有成员函数,但在DerivedPrivate外部将不可访问  
        protectedFunc(); // 可以访问保护成员函数  
        // privateFunc(); // 错误!无法访问私有成员函数  
    }  
};  
  
int main() {  
    DerivedPublic dp;  
    dp.publicFunc();     // 正确:公有成员函数在类外可访问  
    // dp.protectedFunc(); // 错误:保护成员函数在类外不可访问  
    // dp.privateFunc();   // 错误:私有成员函数在类外不可访问  
  
    DerivedProtected dp2;  
    // dp2.publicFunc();    // 错误:公有成员函数在protected继承下,类外不可访问  
    // dp2.protectedFunc(); // 错误:保护成员函数在类外不可访问  
  
    DerivedPrivate dp3;  
    // dp3.publicFunc();    // 错误:公有成员函数在private继承下,类外不可访问  
    // dp3.protectedFunc(); // 错误:保护成员函数在类外不可访问  
  
    return 0;  
}

在这个例子中,基类Base有三个成员函数:publicFunc、protectedFunc和privateFunc,它们分别是公有、保护和私有的。

请仔细阅读以下说明:

然后,我们定义了三个派生类DerivedPublic、DerivedProtected和DerivedPrivate,它们分别使用public、protected和private继承Base类。

在DerivedPublic中,所有从Base继承来的公有和保护成员函数都可以在派生类的成员函数内部访问,但私有成员函数无法访问。在类外部,只有公有成员函数可以访问。

在DerivedProtected中,所有从Base继承来的公有和保护成员函数都可以在派生类的成员函数内部访问,但私有成员函数无法访问。在类外部,所有继承来的成员函数都不可访问。

在DerivedPrivate中,情况与DerivedProtected相同,但在类外部,所有继承来的成员函数都不可访问,即使它们在基类中是公有的。

1.3 c++中Public/Private/Protected成员函数和成员变量的继承中权限管理

在C++中,使用public、private、protected继承时,成员函数和成员变量的访问权限管理在本质上是相似的,但有一些细微的差别需要注意。

  1. 继承类型对成员访问权限的影响

    • public继承:基类的公有成员和保护成员按照原有的访问权限在派生类中保持不变,而基类的私有成员在派生类中不可访问。
    • private继承:基类的公有成员和保护成员在派生类中变为私有成员,而基类的私有成员在派生类中仍然不可访问。
    • protected继承:基类的公有成员和保护成员在派生类中变为保护成员,而基类的私有成员在派生类中仍然不可访问。
  2. 成员函数和成员变量的特殊之处

    • 成员函数:无论继承类型如何,派生类的成员函数总是可以访问基类中的公有成员和保护成员(除非这些成员在基类中被声明为不可访问,例如通过私有继承)。私有成员在派生类中始终不可访问。

    • 成员变量:成员变量的访问权限受继承类型的影响,与成员函数相同。但是,当通过派生类的对象访问成员变量时,访问权限还受到成员变量在派生类中的声明的影响。

  3. 访问权限的“叠加”效应

    • 当派生类继承自基类时,派生类的成员函数可以访问基类中的公有成员和保护成员(根据继承类型可能有所变化)。但是,当通过派生类的对象访问这些成员时,实际的访问权限是基类中的访问权限和派生类中可能的任何额外声明(如使用using声明)的结合。
  4. using声明的作用

    • 在派生类中,可以使用using声明来改变基类成员的访问权限。例如,如果基类有一个私有成员,派生类无法通过using声明来直接访问它,但如果基类有一个保护成员,派生类可以使用using声明将其在派生类中的访问权限提升为公有。

综上所述,虽然成员函数和成员变量在继承时的访问权限管理在本质上是相似的,但成员函数总是可以访问基类中的公有成员和保护成员(除非这些成员在基类中被声明为不可访问),而成员变量的访问权限还受到通过派生类对象访问时的影响。此外,using声明可以在派生类中用来改变基类成员的访问权限(但有一些限制)。

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值