`
- 浏览:
16062408 次
- 性别:
- 来自:
济南
-
★ 关于函数成员指针1. 派生类的成员指针可以指向基类的相应成员;2. 基类的成员指针不一定可以指向派生类的相应成员; 1) 如果派生类覆写了基类的函数,不可以; 2) 如果派生类没有覆写基类的函数,可以; 3) 如果是派生类中新加的函数,不可以。原因:1. 派生类具有基类的所有成员;2. 1) 此时基类和派生类中的该函数声明一样,定义不一样;如果此时允许基类该函数的指针指向派生类的该函数,则在用基类指针调用该指针指向的函数时,调用的将是基类中的该函数,这就违背了用户的本义;因此不可以; 2) 此时基类和派生类中的该函数从声明到定义都一模一样; 3) 派生类中的该成员在基类中不存在。例子程序:######################## 不包括本行 #########################/**************************************************************************** 文件名:testMemberPointer.cpp* 描述:测试成员指针* 结论:1. 派生类的成员指针可以指向基类的相应成员;* 2. 基类的成员指针不一定可以指向派生类的相应成员;* 1) 如果派生类覆写了基类的函数,不可以;* 2) 如果派生类没有覆写基类的函数,可以;* 3) 如果是派生类中新加的函数,不可以。* 作者:Lin Xiaobin* 创建时间:2006-11-04***************************************************************************/#include <iostream>using std::cout;using std::endl;class Base{public: virtual void func() { cout << "base.func" << endl; } void f() { cout << "another base.func" << endl; }};class Derived : public Base{public: void func() { cout << "derived.func" << endl; }};int main(int argc, char *argv[]){ typedef void (Base::*PBMF)(); typedef void (Derived::*PDMF)(); typedef int Base::*PBMD; // 允许,虽然 Base 类里没有 int 数据成员 typedef int Derived::*PDMD; // 允许,虽然 Derived 类里也没有 int 数据成员 PBMD p; // 允许,虽然 Base 类里没有 int 数据成员 Base *bd = new Derived; // 可以 Base *b = new Base; // 可以 //Derived *db = new Base; // 错误,无法将类型 Derived* 转换为类型 Base*。 Derived *d = new Derived; //PBMF pbmf1 = &Derived::func; // 错误,派生类覆写了函数 func, // 无法将类型 void(Derived::*)() // 转换为类型 void(Base::*)()。 PBMF pbmf2 = &Base::func; // 可以 PBMF pbmf3 = &Base::f; // 可以 PBMF pbmf4 = &Derived::f; // 可以,派生类没有覆写函数 f PDMF pdmf1 = &Derived::func; // 可以 PDMF pdmf2 = &Base::func; // 也可以 (d->*pbmf2)(); // 可以,若为虚函数,调用 Derived::func,否则调用 Base:func (d->*pdmf1)(); // 可以,调用 Derived::func (d->*pdmf2)(); // 可以,若为虚函数,调用 Derived::func,否则调用 Base:func (b->*pbmf2)(); // 可以,调用 Base::func //(b->*pdmf1)(); // 错误,类型不兼容 //(b->*pdmf2)(); // 错误,类型不兼容 (bd->*pbmf2)(); // 可以,若为虚函数,调用 Derived::func,否则调用 Base:func //(bd->*pdmf1)(); // 错误,类型不兼容 //(bd->*pdmf2)(); // 错误,类型不兼容 return 0;}######################## 不包括本行 #########################★ 关于数据成员指针参考:http://www.zdnet.com.cn/developer/code/story/0,3800066897,39308240,00.htm
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
C++中一般函数指针和类的成员函数指针的区别
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的...
在C++中,函数指针一般是指全局命名空间中的函数指针,类成员函数指针,与函数指针不同的是,类具有类域操作符,在声明类成员函数指针的时候,要指定成员函数返回值类型、类域操作符、成员函数参数列表
1.普通函数指针指向普通函数 2.普通函数指向非静态成员函数 3. 类外部的 类函数指针 指向...4. 类外部的 类函数指针 指向成员函数 5. 类内部的 函数指针 指向成员函数 (类似于第2条) 6. 类内部的 函数指针 指向普通函数
指向类的静态成员的指针,通过指针访问类的静态数据成员
c++ 成员函数指针,使用非常方便,采用vs2005开发环境
下面给出一个使用指向类成员指针的例子: #include class A { public: A(int i) { a=i; } int fun(int b) { return a*c+b; } int c; private: int a; }; void main() { A x(8); //定义类A的一个...
通过函数指针调用C++非静态成员函数通过函数指针调用C++非静态成员函数
成员函数指针与高性能的C++委托着重描述C++中如何实现其他面向对象语言如C#,JAVE中的委托功能
高手编程笔记 如何使用成员函数指针 高手编程笔记 如何使用成员函数指针 高手编程笔记 如何使用成员函数指针
本介绍怎样operater+()重载类的char*型成员变量。
复制构造函数引用this指针静态成员.ppt
在这个类中有一个成员方法叫getArray(),在该方法中使用以上方式声明一个数组,然后返回数组的指针,然后在另一个成员方法showPointerOfArray(int*)接收传过来的int指针,在这个方法操作数组。 但是在运行时没有出现...
C++ 7种智能指针测试代码
由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。 1、指向一般函数的指针函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数...
C#结构体指针的定义及使用详解
指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍: 一、指向类的普通成员的指针(非静态) 1、指向类成员函数的指针 简单的讲,指向类成员...
博文地址:https://blog.csdn.net/maoyeahcom/article/details/107106680
使用c++的成员指针实现类似Borland VCL组件的事件回调机制(下)
使用c++的成员指针实现类似Borland VCL组件的事件回调机制(上)