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;