C++ C++;简单继承问题 #包括 使用名称空间std; 甲级 { 受保护的: INTA; }; B类:公共A { 公众: int func(A*p) { 库塔; } };
我真的不明白为什么我不能通过“p->a”访问“a”C++ C++;简单继承问题 #包括 使用名称空间std; 甲级 { 受保护的: INTA; }; B类:公共A { 公众: int func(A*p) { 库塔; } };,c++,class,inheritance,C++,Class,Inheritance,我真的不明白为什么我不能通过“p->a”访问“a” 在不将“受保护”更改为“公共”的情况下,是否仍可以访问B类中的p成员“a” 使用p->a只允许您访问a的公共变量。由于a是受保护的变量,您应该使用coutAhh,这是一个好问题。首先,让我先说B不是a的朋友,因此不能通过对象的“a”视图访问a的隐私(或受保护的隐私)。即使我们在B类的范围内,我们也不能只看A类的隐私(或受保护的隐私) 但是,B确实有一个a。而且它确实可以访问它,因为它被声明为a的受保护成员。但是查看B内部inta的唯一方法是从对
在不将“受保护”更改为“公共”的情况下,是否仍可以访问B类中的p成员“a” 使用
p->a
只允许您访问a的公共变量。由于a
是受保护的变量,您应该使用coutAhh,这是一个好问题。首先,让我先说B
不是a
的朋友,因此不能通过对象的“a”视图访问a
的隐私(或受保护的隐私)。即使我们在B类
的范围内,我们也不能只看A类
的隐私(或受保护的隐私)
但是,B确实有一个a
。而且它确实可以访问它,因为它被声明为a
的受保护成员。但是查看B
内部inta
的唯一方法是从对象的B
视图中获取它 关于此主题,C++03标准规定(重点):
11.5受保护的成员访问
1当一位朋友或一位会员
派生类引用受保护的非静态成员函数或
受保护的基类的非静态数据成员,访问检查
除第条前面所述的内容外,还应适用
11除非形成指向成员(5.3.1)的指针,访问
必须通过指向派生对象的指针、引用或对象
类本身(或从该类派生的任何类)(5.2.5)
但是,您在这里所做的是尝试通过指向基类的指针进行访问,这是非法的。如果您将签名更改为
#include <iostream>
using namespace std;
class A
{
protected:
int a;
};
class B : public A
{
public:
int func(A* p)
{
cout << p->a;
}
};
您会发现它现在编译正常
这也是您可以从类B
内部轻松访问a
的原因:通过隐式指针This
进行访问,该指针类型为B*
(再次为派生类)。如果您尝试了以下方法:
int func(B* p) // instead of A*
好的,您应该能够访问a
,那么您使用的是什么编译器和操作系统呢?还有,编译此文件时会生成哪些消息?您是否可以只访问a
而不是p->a
?错误C2248:“a::a”:无法访问在类“a”中声明的受保护成员我当前正在使用Visual Studio 2010…friend似乎也不起作用:(我尝试了#包括使用命名空间std;类a{protected:int a;};B类:public A{friend class A;public:int func(A*p){cout A;}};相反:A类:{friend class B;..}没有公共和受保护的“版本”编译器不允许您通过指向基类的指针访问非公共成员。@djeidot:答案仍然是误导性的和不完整的。a
与p->a
不同,事实上您可以通过参数访问p->a
,例如执行dynamic_cast(p)->a
(尽管这有它自己的一套陷阱)。乔恩有很多东西!!C++比我以前想象的更有趣:
A* parent = static_cast<A*>(this);
int x = parent->a; // Does not compile!
class A
{
public:
// Added virtual destructor so that the class acquires a vptr,
// making dynamic_cast possible.
virtual ~A() {};
protected:
int a;
};
class B : public A
{
public:
int func(A* p)
{
// Now if we downcast p to B* we can access a just fine
// Of course if p does not actually point to a B, the
// program will have undefined behavior
int x = dynamic_cast<B*>(p)->a;
}
};