簡體   English   中英

成員函數指針轉換

[英]member function pointer conversion

#include <iostream>
using namespace std;


class A {
};
typedef void (A::*funA)(int);

class B : public A {
public:
void m(int) {std::cout << "mm" << std::endl; }
void n(int) { std::cout << "nn"<<std::endl; }   
};
typedef void (B::*funB)(int);

class C : public B {
public:
void g(int) {std::cout << "gg" << std::endl; }
void h(int) { std::cout << "hh"<<std::endl; }
};
typedef void (C::*funC)(int);

int main() {
funB f = static_cast<funB>(&C::m);
A* pa = new A;
(pa->*(static_cast<funA>(f)))(2);
return 0;
}

gcc編譯並輸出“ mm”。 但是為什么這可以工作呢? 實際上,A類沒有定義任何功能。 似乎類可以通過這種方式使用其基類或派生類函數,即使它沒有定義它們。

由於A不包含f引用的成員,因此行為是不確定的。

無論如何,它可能起作用的可能原因是函數B::m不會觸碰this指針,因此在錯誤類型的對象上調用它時,它不會“注意”。 另外, AB不是多態的,因此取消引用成員指針並進行調用不需要檢查任何vptr。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM