20. 同名静态成员处理
① 静态成员和非静态成员出现同名,处理方式一致:
1. 访问子类同名成员,直接访问
2. 访问父类同名成员,需要加作用域
② 加上static关键字后,成员发生变化,成员变成静态成员。
③ 静态成员变量特点:
1. 所有对象都共享同一份数据。
2. 编译阶段就分配内存。
3. 类内声明,类外初始化。
④ 静态成员函数特点:
1. 只能访问静态成员变量,不能访问非静态成员变量。
2. 所有对象都共享同一份函数实例。
#include <iostream>
using namespace std;
//继承中同名静态成员处理方式
class Base
{
public:
static int m_A; //静态成员类内声明,类外初始化
static void func()
{
cout << "Base - static func()" << endl;
}
static void func(int a)
{
cout << "Base - static func(int a)" << endl;
}
};
int Base::m_A=100;
class Son:public Base
{
public:
static int m_A;
static void func()
{
cout << "Son - static void func()" << endl;
}
};
int Son::m_A = 200;
//同名静态成员属性
void test01()
{
//1、通过对象访问
Son s;
cout << "Son 下 m_A = " << s.m_A << endl;
cout << "Base 下 m_A = " << s.Base::m_A << endl;
//2、通过类名访问
cout << "Son 下 m_A = "<< Son::m_A << endl;
//第一个::代表通过类名方式访问 第二个::代表访问父类作用域
cout << "Base 下 m_A= "<< Son::Base::m_A << endl;
}
void test02()
{
//1、通过对象访问
Son s;
s.func();
s.Base::func();
//2、通过类名访问
Son::func();
Son::Base::func();
//子类出现和父类同名静态成员函数,也会隐藏掉父类中所有同名成员函数
//如何想访问父类中被隐藏同名成员,需要加作用域
Son::Base::func(100);
}
//同名成员函数处理
int main()
{
test01();
test02();
system("pause");
return 0;
}
运行结果:
- Son 下 m_A = 200
- Base 下 m_A = 100
- Son 下 m_A = 200
- Base 下 m_A= 100
- Son - static void func()
- Base - static func()
- Son - static void func()
- Base - static func()
- Base - static func(int a)
- 请按任意键继续. . .
21. 多继承语法
① C++运行一个类继承多个类。
② 语法:class 子类:继承方式 父类1,继承方式 父类2,.....
③ 多继承可能会引发父类中有同名成员出现,需要加作用域区分。
④ C++实际开发中不建议用多继承。
#include <iostream>
using namespace std;
class Base1
{
public:
Base1()
{
m_A = 100;
}
int m_A;
};
class Base2
{
public:
Base2()
{
m_A = 200;
}
int m_A;
};
//子类 需要继承Base1和Base2
//语法:class 子类:继承方式 父类1,继承方式 父类2,.....
class Son:public Base1,public Base2
{
public:
Son()
{
m_C = 300;
m_D = 400;
}
int m_C;
int m_D;
};
void test01()
{
Son s;
cout << "sizeof(Son):" << sizeof(s) << endl;
//当父类中出现同名成员,需要加作用域区分
cout << "Base1::m_A = " << s.Base1::m_A << endl;
cout << "Base2::m_A = " << s.Base2::m_A << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果:
- sizeof(Son):16
- Base1::m_A = 100
- Base2::m_A = 200
- 请按任意键继续. . .
链接:https://www.zhihu.com/question/437657370/answer/1692846096