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