Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;简单继承问题 #包括 使用名称空间std; 甲级 { 受保护的: INTA; }; B类:公共A { 公众: int func(A*p) { 库塔; } };_C++_Class_Inheritance - Fatal编程技术网

C++ C++;简单继承问题 #包括 使用名称空间std; 甲级 { 受保护的: INTA; }; B类:公共A { 公众: int func(A*p) { 库塔; } };

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的唯一方法是从对

我真的不明白为什么我不能通过“p->a”访问“a”


在不将“受保护”更改为“公共”的情况下,是否仍可以访问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;
    }
};