继承和友元,静态成员的关系

举报
芒果_Mango 发表于 2022/07/31 23:31:49 2022/07/31
【摘要】 5.继承与友元友元关系不能继承,也就是说基类友元可以访问基类的私有和保护成员,但是不能访问子类私有和保护成员例如:你爸爸的朋友你不一定认识class Student;//声明class Person{public: //声明Display函数是Person类的友元 friend void Display(const Person& p, const Student& s);pr...

5.继承与友元

友元关系不能继承,也就是说基类友元可以访问基类的私有和保护成员,但是不能访问子类私有和保护成员

例如:你爸爸的朋友你不一定认识

image-20220313093937743

class Student;//声明
class Person
{
public:
    //声明Display函数是Person类的友元
    friend void Display(const Person& p, const Student& s);
private:
    string _name;
};class Student: public Person
{
private:
    int _stuid;
};
void Display(const Person& p, const Student& s)
{
    cout << p._name << endl; //可以访问
    cout << s._stuid << endl;//不可以访问
}

若想让Display函数也能够访问派生类Student的私有和保护成员,只能在派生类Student当中进行友元声明

class Student : public Person
{
public:
    //声明Display函数是Student类的友元
    friend void Display(const Person& p, const Student& s);
protected:
    int _stuid; 
};

6.继承与静态成员

基类定义了static静态成员,则整个继承体系里面只有一个这样的静态成员无论派生出多少个子类,都只有一 个static成员实例 。

例如:当基类Person中定义了一个静态成员变量count,派生类Student和Teacher都继承了基类Person的成员,但是再整个继承体系中,只有一个静态成员变量count

我们可以通过该静态成员变量count的数值,得知创建的对象个数

由于通过派生类/基类创建一个对象,都需要调用基类的构造函数/拷贝构造函数初始化基类的部分成员,所以我们可以在基类的构造函数/拷贝构造函数中累加_count的值,就可以得知创建了多少个对象

//基类
class Person
{
public:
    //基类的构造函数
    Person()
    {
        ++_count;
    }
    //基类的拷贝构造函数
    Person(const Person& p)
    {
        ++_count;
    }
public:
    static int _count;//静态成员变量
protected:
    string _name;
};
int Person::_count = 0;//静态成员变量在类外初始化//派生类
class Student :public Person
{
private:
    int _stuid;
};//派生类
class Teacher :public Person
{
private:
    int _teaid;
};
void func(Student s)
{}
//可以通过_count的大小得知创建的对象的个数
int main()
{
    Student s1;
    Student s2 = s1;
    Teacher t1;
    Person p;
    func(s1);//传值传参也是一次拷贝构造
    //_count成员是同一个 整个继承体系里面只有一个这样的静态成员
    cout << Person::_count << endl;//5
    cout << Student::_count << endl;//5
    return 0;
}

验证:整个继承体系里面只有一个这样的静态成员

//三者的地址相同
cout << &Person::_count << endl;
cout << &Student::_count << endl;
cout << &Teacher::_count << endl;

\

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。