对于C++中说基类成员函数只能访问基类成员,而不能访问派生类的成员,有疑问?
在谭浩强老师关于继承和派生里面,有这样一段对派生类成员的访问属性论断!"基类成员函数只能访问基类成员,而不能访问派生类的成员",这句话不对吧?我想,如果派生类成员为pub...
在谭浩强老师关于继承和派生里面,有这样一段对派生类成员的访问属性论断!
"基类成员函数只能访问基类成员,而不能访问派生类的成员",这句话不对吧?我想,如果派生类成员为public属性,也不能被基类的成员函数访问么? 展开
"基类成员函数只能访问基类成员,而不能访问派生类的成员",这句话不对吧?我想,如果派生类成员为public属性,也不能被基类的成员函数访问么? 展开
2个回答
推荐于2017-09-30
展开全部
首先,派生类的新成员不在基类的作用域内,那么如果基类想要访问派生类的新添加成员就必须只能是派生类对象的成员(情况1)或者派生类的静态数据成员(情况2)。
其次,基类的定义必定是在派生类前面的,那么,基类要想使用派生类的新添加成员,必须对派生类作前置声明。而又因为仅有前置声明是不能定义实体对象的,所以情况1是不可能的。情况2基本同理。
情况1:
class B;//前置声明
B b;//这里会出错,因为编译器此时还不能获取到B的定义,根本无法创建B类的实体对象
class A
{
public:
void f()
{
cout << b.y;//试图访问派生类对象的成员
}
};
class B : public A
{
public:
static int x;
int y;
};
情况2:
class B;//前置声明
class A
{
public:
void f()
{
cout << B::x;//试图访问派生类的静态成员。这里会出错,因为编译器此时还不能获取到B::x的定义
}
};
class B : public A
{
public:
static int x;
int y;
};
其次,基类的定义必定是在派生类前面的,那么,基类要想使用派生类的新添加成员,必须对派生类作前置声明。而又因为仅有前置声明是不能定义实体对象的,所以情况1是不可能的。情况2基本同理。
情况1:
class B;//前置声明
B b;//这里会出错,因为编译器此时还不能获取到B的定义,根本无法创建B类的实体对象
class A
{
public:
void f()
{
cout << b.y;//试图访问派生类对象的成员
}
};
class B : public A
{
public:
static int x;
int y;
};
情况2:
class B;//前置声明
class A
{
public:
void f()
{
cout << B::x;//试图访问派生类的静态成员。这里会出错,因为编译器此时还不能获取到B::x的定义
}
};
class B : public A
{
public:
static int x;
int y;
};
追问
谢谢你!我一直认为,public 定义的数据成员和普通变量类似,因为只要在对象的作用域内,public成员变量都是可以引用的!其实书上说的没有将清楚,应该这样讲,基类的成员函数不能直接引用派生类的数据成员,因为基类的数据成员和派生类的数据成员this指针不一样。这是一点,另外一点,就像你说的,即使提前声明,但是C++规定要求有前置声明是不能定义实体对象的,只能引用对象的指针或者引用!
追答
然后?可以采纳我的答案么?谢谢了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |