8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员相关的知识,希望对你有一定的参考价值。

(1):继承中的作用域

在学习作用域时,我们说过代码中可以定义在不同作用域中的同名变量,并且输出时会遵循就近原则。
在这里插入图片描述
同样,在继承体系中父类和子类也拥有各自独立的作用域,这意味着他们之间可以定义同名的成员

如下,父类和子类都具有成员num,父类的num=123,子类的num999

#include <iostream>
#include <string>
using namespace std;

class Person
{
public:
	string _name = "小张";
	int _num = 123;
};

class Student : public Person
{

public:
	void print()
	{
		cout << _name << " " << _num << endl;
	}
public:
	int _num = 999;
};

int main()
{
	Student s1;
	s1.print();
}

最终子类打印时,也符合就近原则,打印了num=999
在这里插入图片描述

  • 如果想要打印父类的num,那么就必须要要加入域作用限制符
    在这里插入图片描述

因此像这样,子类和父类具有同名的成员,而子类成员会对同名父类成员进行屏蔽,这种情况我们称之为隐藏,或者叫做重定义。如果在子类成员中需要访问被屏蔽的同名父类成员,则需要使用域作用限制符

这里需要注意:如果成员函数同名,这个函数不是重载,而是隐藏,这一点具有迷惑性,而且只需要函数名相同就可以构成隐藏

#include <iostream>
#include <string>
using namespace std;

class A
{
public:
	void fun()
	{
		cout << "fun()" << endl;
	}
};

class B : public A
{
public:
	void fun(int i)
	{
		cout << "fun(int i)" << endl;
	}
};

int main()
{
	B b;
	b.fun(10);//调用b的
	b.A::fun();//调用A的

}

在这里插入图片描述

(2):友元关系不能被继承

友元不能被继承,也就是说父类的友元函数不能访问子类的私有或保护成员

(3):静态成员和继承

父类定义的static成员,继承体系中只有这么一个成员,无论产生多少子类,都只有一个static

以下代码可以证明所有派生出的子类使用的都是一个static实例

class Person
{
public:
	Person() {
		++_count;
	}
	static int _count;//统计派生了多少子类
};
int Person::_count = 0;

class A : public Person {
//所有的派生两类都先要都先要调用父类的构造
};
class B : public Person {
	//所有的派生两类都先要都先要调用父类的构造
};

int main()
{
	A a1;
	A a2;
	B b1;
	B b2;
	
	cout << Person::_count << endl;
	B::_count = 1;//B修改为1
	cout << B::_count << endl;
}

在这里插入图片描述

以上是关于8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员的主要内容,如果未能解决你的问题,请参考以下文章

C++之继承详解

继承中类的作用域

深入浅出之C++中的继承

继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承

C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承