栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ 非静态成员引用必须与特定对象相对

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ 非静态成员引用必须与特定对象相对

        最近在学习C++多继承语法的时候,想通过类访问子类同名成员的时候,出现了如下的错误:

 具体代码如下:

#include 
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_D;
	int m_C;
};

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;  //对象添加作用域 
	cout << "base2的m_A=" << Son::base2::m_A << endl;
}

int main()
{
	test01();

	return 0;
}

        经过多次搜索后,成功找到了解决方法:

报错原因:

        类的成员有两种:静态成员和实例成员(包括实例和函数)。

        实例成员的存储空间属于具体的实例,不同实例(对象)的同名成员拥有不同的存储空间;静态成员的存储空间是固定的,与具体的实例(对象)无关,被该类的所有实例共享。

        而我在代码中想访问的是非静态变量,使用了类访问:Son::base2::m_A  ,因此会报错。

解决方法:

1.将base2中的m_A由非静态变量改为静态变量static int  m_A。

2.使用对象访问:Son s; s.base::m_A; 

总结:

访问静态成员变量

可以使用:Son::base2::m_A;

也可以使用:Son s; s.base2::m_A;

但最好使用前者方式访问,因为这样很容易判定成员是静态成员。

访问非静态成员变量

只能使用:Son s; s.base2::m_A;

不能使用:Son::base2::m_A;

本例就是使用了后者的方式访问非静态成员变量而报错。

                          欢迎一键三连!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/513158.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号