子类之间的成员函数互相调用
2017-03-12 16:31
176 查看
#include<iostream> using namespace std; //#pragma warning(disable:2162) class A{ }; //定义成员函数类型 typedef void (A::*F)(); //强制类型转换 #define Class_Func_Cast(selector) (F)(&selector) //#define str(selector) ##Class_Func_Cast(selector)## //#define str(a) #a //一定要共有继承,否则无法转换 class B:public A{ public: void f(){ cout << "B::f" << endl; } //测试this和成员函数的调用 void test(){ F f = Class_Func_Cast(B::f); (this->*f)(); cout << "B::test over" << endl; } //调用继承A的所有子类成员方法:void function(); static void callSonOfAClassVoidFunc(F f){ cout << "callSonOfAClassVoidFunc begin..." << endl; A a; (a.*f)(); cout << "callSonOfAClassVoidFunc end!" << endl; } }; class C:public A{ public: void f1(){ cout << "C::f" << endl; } void f2(){ cout << "C::f2" << endl; } void f3(){ cout << "C::f3" << endl; } //在B类(其他类)中调用C类(自己的类)本身的成员函数 void testf123(){ B::callSonOfAClassVoidFunc(Class_Func_Cast(C::f1)); B::callSonOfAClassVoidFunc(Class_Func_Cast(C::f2)); B::callSonOfAClassVoidFunc(Class_Func_Cast(C::f3)); cout << "C::test123 end!" << endl; } }; int main(){ //cout << str(B::f) << endl; cout << sizeof(F) << endl; B b; void (B::*f)() = &B::f; (b.*f)(); F f1 = Class_Func_Cast(B::f); (b.*f1)(); A a; (a.*f1)(); b.test(); //f1(); auto f2 = Class_Func_Cast(B::f); (a.*f2)(); C c; c.testf123(); cout << "func wrapper over" << endl; return 0; }
4 B::f B::f B::f B::f B::test over B::f callSonOfAClassVoidFunc begin... C::f callSonOfAClassVoidFunc end! callSonOfAClassVoidFunc begin... C::f2 callSonOfAClassVoidFunc end! callSonOfAClassVoidFunc begin... C::f3 callSonOfAClassVoidFunc end! C::test123 end! func wrapper over
参考:
编译器错误 C2064
Visual Studio 2010其他版本
项不会计算为接受“number”个参数的函数
通过表达式调用了函数。 该表达式未计算为函数指针。
下面的示例生成 C2064:
// C2064.cpp int i, j; char* p; void func() { j = i(); // C2064, i is not a function p(); // C2064, p doesn't point to a function }
下面的示例生成 C2064:
// C2064b.cpp struct C { void func1(){} void func2(){} }; typedef void (C::*pFunc)(); int main() { C c; pFunc funcArray[2] = {&C::func1, &C::func2}; (funcArray[0])(); // C2064 }
可能的解决方法:
// C2064c.cpp struct C { void func1(){} void func2(){} }; typedef void (C::*pFunc)(); int main() { C c; pFunc funcArray[2] = {&C::func1, &C::func2}; (c.* funcArray[0])(); }
下面的示例生成 C2064:
// C2064d.cpp struct C { typedef void (C::*pFunc)(); pFunc funcArray[2]; void func1(){} void func2(){} C() { funcArray[0] = C::func1; funcArray[1] = C::func2; } void func3() { (funcArray[0])(); // C2064 } };
可能的解决方案:
// C2064e.cpp // compile with: /c struct C { typedef void (C::*pFunc)(); pFunc funcArray[2]; void func1(){} void func2(){} C() { funcArray[0] = &C::func1; funcArray[1] = &C::func2; } void func3() { (this->* funcArray[0])(); } };
相关文章推荐
- 在一个类里面 成员函数之间的互相调用
- C++继承类和基类之间成员函数和虚函数调用机制
- 基类子类的this指针相同,但在基类函数永远调用基类的成员变量
- C++静态成员(静态成员变量、静态成员函数)与正常成员互相调用的权限问题
- Html之frameset,iframe框架之间如何互相调用变量、函数-yellowcong
- C++继承类和基类之间成员函数和虚函数调用机制
- frameset,iframe框架之间如何互相调用变量、函数
- C++继承类和基类之间成员函数和虚函数调用机制
- JS备忘--子父页面获取元素属性、显示时间,iframe之间互相调用函数
- c++ 父类指针转换为子类指针后调用子类的成员函数问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- 类的成员函数和全局函数的互相调用
- 类成员函数之间的调用
- 关于如何在不使用虚函数的情况下父类调用子类成员函数的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- C++继承时子类定义同名成员变量时的调用继承函数的问题
- 两个JS之间的函数互相调用
- 同一个C语言工程不同C文件之间的函数互相调用问题(二)
- frameset,iframe框架之间如何互相调用变量、函数
- 父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数.