Pas*_*cal 6 c++ function-pointers
以下代码给出了void b() { m = &A::a; };声明A::a()受保护的编译错误.(它是 - 但这应该没问题)
然而编译器在我写的时候并不关心B::a().即使两者都意味着我想要的相同,A::a()因为它明确表示a()在A中定义.
那么禁止的原因A::a()是什么?
编辑
也许有人可以找到一个例子,如果A::a()允许的话会有问题B::b().如果有这样的例子,我会将其标记为问题的答案.
/编辑
#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
Run Code Online (Sandbox Code Playgroud)
代码说明:
在BI中想要存储一个函数指针,指向A中的方法,以便稍后调用它B::c().是的,这也发生在现实生活中.:-)
原因应该类似于为什么你不能在 B 中执行此操作:
class B: public A
{
//...
void foo(A& x) {
x.a(); //error
}
void foo(B& x) {
x.a(); //OK
}
};
Run Code Online (Sandbox Code Playgroud)
受保护并不意味着 B 可以访问任何类的 A 部分,只要它是 A / 从 A 派生即可。受保护的内容仅适用于 B 的该实例和其他实例。
| 归档时间: |
|
| 查看次数: |
329 次 |
| 最近记录: |