Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++_Inheritance - Fatal编程技术网

C++ 为什么不可能获得指向基类的受保护方法的指针?

C++ 为什么不可能获得指向基类的受保护方法的指针?,c++,inheritance,C++,Inheritance,类A编译没有问题。类B产生编译错误: “A::foo”:无法访问类“A”中声明的受保护成员 为什么会这样,原因是什么?有没有办法避免这种情况(如果我需要回调的指针,std::function等)?大概是为了安全。如果你可以得到一个指向该成员的指针,并将它交给任何人,而不必发出某种警钟,那将是危险的 这里有一个解决方法(其他人可能更了解): 编辑-认为您可能需要一个使用::foo的脚本,但您甚至不需要它。工作时不必担心。见: 您可以通过B访问它,即: class A { public: A

A
编译没有问题。类
B
产生编译错误:

“A::foo”:无法访问类“A”中声明的受保护成员


为什么会这样,原因是什么?有没有办法避免这种情况(如果我需要回调的指针,
std::function
等)?

大概是为了安全。如果你可以得到一个指向该成员的指针,并将它交给任何人,而不必发出某种警钟,那将是危险的

这里有一个解决方法(其他人可能更了解):

编辑-认为您可能需要一个使用::foo的脚本,但您甚至不需要它。工作时不必担心。见:


您可以通过
B
访问它,即:

class A {
public:
    A() {auto tmp = &A::foo;}
protected:
    void foo() {}
};

class B : public A {
public:
    B() {auto tmp = &B::foo;}
};

您不能从外部访问
&A::Foo
,因为它受保护,但您可以通过继承访问
&A::Foo
(因为
Foo
通过继承成为
B
的成员),也就是说,如果您能够将指针指向
A::Foo
,则可以调用
&B::Foo
,您可以使用它在类型为
A
或类型为
C
的对象(从
A
派生)上调用
foo

class B : public A {
public:
   B() {auto tmp = &B::foo;}
};
相反,使用指向
B::foo
的指针;这很好,因为您只能在您自己的类
B
类型的对象上使用它

为什么会这样,原因是什么

通常,派生类只能访问同一派生类的受保护成员,而不能访问基类本身或具有相同基类的任意类的受保护成员。因此
B
可以通过
B
访问
A
的受保护成员,但不能直接通过
A

有没有办法避免这种情况

继承的成员也是
B
的成员,可以这样访问:

class B : public A {
public:
    void xx(A a) { auto tmp = &A::foo; a.*tmp(); }  // illegal
}
“大概是为了安全”——有很多方法可以将指向成员的指针指向任何人
class B : public A {
public:
    void xx(A a) { auto tmp = &A::foo; a.*tmp(); }  // illegal
}
auto tmp = &B::foo;