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

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()
的原因。