C++ 为什么不能存储基类的函数指针?
下面的代码给出了C++ 为什么不能存储基类的函数指针?,c++,function-pointers,C++,Function Pointers,下面的代码给出了void b(){m=&A::A;}的编译错误声明A::A()受保护。(确实如此,但这应该没有问题) 但是,当我编写B::a()时,编译器并不关心。即使两者的意思相同,我还是更喜欢A::A(),因为它明确指出A()是在A中定义的 那么禁止A::A()的原因是什么 编辑 如果B::B()中允许A::A(),可能有人会找到一个有问题的例子。如果有这样一个例子,我会将其标记为问题的答案。 /EDIT #include <iostream> #include <ioma
void b(){m=&A::A;}的编译错误代码>声明A::A()
受保护。(确实如此,但这应该没有问题)
但是,当我编写B::a()
时,编译器并不关心。即使两者的意思相同,我还是更喜欢A::A()
,因为它明确指出A()
是在A中定义的
那么禁止A::A()
的原因是什么
编辑
如果B::B()
中允许A::A()
,可能有人会找到一个有问题的例子。如果有这样一个例子,我会将其标记为问题的答案。
/EDIT
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdio>
class A {
protected:
void a(){ std::cout << "A::a()" << std::endl; };
};
typedef void (A::*f)();
class B : public A {
public:
void b() { m = &A::a; }; // wont compile
// void b() { m = &B::a; }; // works fine
void c() { (this->*m)(); };
protected:
f m;
};
int main(){
B b;
b.b();
b.c();
}
// compile with
// g++ -Wall main.cpp -o main
#包括
#包括
#包括
#包括
甲级{
受保护的:
void a(){std::cout,因为否则外部世界可以找到此受保护的成员:
另请参见。如果您试图通过全局命名空间(此处A::A是::A::A)访问受保护的成员,请改用B::A::A。原因应该类似于在B中无法执行此操作的原因:
class B: public A
{
//...
void foo(A& x) {
x.a(); //error
}
void foo(B& x) {
x.a(); //OK
}
};
protected并不意味着B可以访问任何类的A部分,只要它是A/派生自A。受保护的内容仅适用于B的这个和其他实例。有趣的是,gcc-3.4.2
和gcc-4.3.2
可能与Hmm有关,但我不知道为什么它是n必需的。函数指针和方法仍然在B中受保护。因此,它不能从外部访问,如果是这样的话,将B::B()
还是我完全忽略了这一点?@tuner07,访问保护由表达式的静态类型决定。获取函数指针的实际上下文不起作用。@gf如果访问保护由表达式的静态类型决定,则不可能调用A::A()
在B中的任何位置。但这是可能的。因此,该规则仅适用于函数存储在函数指针中的情况。我仍然看不出编译器必须阻止a::a()
的原因。