Mã sau đây cung cấp lỗi biên dịch cho void b() { m = &A::a; };
cho biết rằng A::a()
được bảo vệ. (Nó là gì - nhưng đó không phải là vấn đề)
Tuy nhiên trình biên dịch không quan tâm khi tôi viết B::a()
. Mặc dù cả hai có nghĩa là cùng tôi muốn A::a()
vì nó khẳng định rằng explicitely a()
được định nghĩa trong A.Tại sao không thể lưu trữ một con trỏ hàm của một lớp cơ sở?
Vì vậy lý do tại sao A::a()
cấm là gì?
EDIT
Có thể ai đó có thể tìm thấy ví dụ có thể gặp sự cố nếu A::a()
được phép trong B::b()
. Nếu có ví dụ như vậy, tôi sẽ đánh dấu nó là câu trả lời cho câu hỏi.
/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
Giải thích về các mã:
Trong B Tôi muốn để lưu trữ một con trỏ hàm đến một phương pháp A để có thể gọi đó là sau này trong B::c()
. Và vâng, điều này cũng xảy ra trong cuộc sống thực. :-)
Vui ... xảy ra cả với 'gcc-3.4.2' và 'gcc-4.3.2' –
có thể liên quan http://stackoverflow.com/questions/477829/cannot-call-base-class-protected-functions/477868#477868 – josefx