自己水平菜,找书看得到如下二则:
C++ 类函数处理经验二则
一、类里面的函数指针
类中的函数指针,所对应的不是函数,而是一个变量,c++标准一直没有对此发表具体的标准。
如下,他既然是变量当然就不可以赋值函数的地址:
#include <iostream>
#include <string>
using namespace std;
void fun() {
cout << "asdf" <<endl;
}
class dd{
public:
dd();
int a_int;
string a_str;
void (*p)();
void (*fun)() ;
/*
*这里不可以这么写,因为p、fun以及fun1都是被当作成员变量而不是函数!
void (*fun1)() {
cout << "fun1" << endl;
}
*/
~dd() {}
};
dd::dd() {
a_int = 10;
a_str = "asdf";
fun = ::fun; //引入全局变量fun函数的地址
p = fun; //相当与赋值
}
int main(int argc, char *argv[]) {
dd a;
a.p();
}
二、函数的名字隐藏
名字隐藏主要是发生在局部的名字隐藏了外部的名字,一般的变量很容易理解,但是类里面的函数重写和重载的出现就有点麻烦了,特别是基类和派生类的关系。
有一点遵循,就是一旦派生类出现了和基类同名的函数,不管是重载和重写,注意重写和重载不是一回事,到底是怎么一回事,google,基类的函数都将被隐藏,加不加virtual并不影响这种格局,还有重载要合法:
1、基类的所有函数都被重写,而且出现重载:
class fun1{
public:
fun1();
virtual void print(long );
virtual void print(string );
void g(long);
void g(double);
private:
string str;
};
class sub_fun1 : public fun1{
public:
sub_fun1() : fun1() {
}
void print(string); //全部重写基类的print函数
void print(long );
void g(long); //全部重写基类的g函数
void g(double);
void print(fun1); //重载print
void g(fun1); //重载g
private:
};
这种情况,基类的同名函数都被屏蔽,重载的函数也照常工作。
2、仅仅全部重写基类某一类同名函数的时候,如:
class fun1{
public:
fun1();
virtual void print(long );
virtual void print(string );
void g(long);
void g(double);
private:
string str;
};
class sub_fun1 : public fun1{
public:
sub_fun1() : fun1() {
}
void print(string);
void print(long ); //g函数得到继承
private:
};
派生类的重写的函数将屏蔽基类的同名函数如print,但是没有重写的函数将继承,如g函数。
3、对一类函数的部分重写,不管出现或者不出现重载,没有被重写的函数将被屏蔽。
4、对基类的函数没有重写,但是在派生类中出现了同名函数的重载,那么基类的同名函数将被全部屏蔽。
5、如果既不重写也不重载,那么基类所有的函数都将被继承。
总结,调用一个被屏蔽的函数,得到的就是一个编译期错误!
最后看一个实例:
//////////////Funtion.h
#include <iostream>
#include <string>
using namespace std;
class fun1{
public:
fun1();
explicit fun1(string );
virtual void print(long );
virtual void print(string );
void g() {
cout << "g()" << endl;
}
private:
string str;
};
class sub_fun1 : public fun1{
public:
sub_fun1() : fun1() {
}
void print(string);
//这里重写的string参数的print函数,屏蔽了float和long参数的print函数,
//对g函数没有重写也没有重载
//void print(float );
//void print(long );
private:
};
///////////////////functon.cpp
#include "funtion.h"
fun1::fun1() {
str = string("fun1");
}
fun1::fun1(std::string a_string) {
str = string(a_string);
}
void fun1::print(string a_int) {
cout << a_int <<endl;
}
void fun1::print(long a_fun1_long) {
cout << a_fun1_long << endl;
}
/*
void sub_fun1::print(long a_long) {
cout << a_long <<endl;
}
void sub_fun1::print(float a_float) {
cout << a_float << endl;
}
*/
void sub_fun1::print(std::string a) {
cout << a << endl;
}
///////////////////main.cpp
#include "funtion.h"
int main() {
fun<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="1" unitname="a">1 a</chmetcnv>;
fun<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="1" unitname="C">1 c</chmetcnv>("dddd");
sub_fun1 b;
//b.print(12.3);调用被屏蔽了的函数,得到的时候一个编译期错误
//b.print(12);也是编译期错误
b.print("sub_fun1");
b.g();
}
分享到:
相关推荐
在类定义中如果没有提供自己的拷贝构造函数,则C++提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。 深拷贝和浅拷贝 默认拷贝构造函数均是浅拷贝 但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存...
为了验证C++类间函数的相互调用,利用VC6.0的对话框和任意一个逻辑类,实现了点击对话框按钮-〉调用逻辑类函数-〉在对话框显示运行结果的功能
C++ 线程函数是类的成员函数 C++ 线程函数是类的成员函数
dlopen加载c++ 函数及类 文档,dlopen加载c++ 函数及类 文档
c++类成员函数作为回调函数
1.普通函数指针指向普通函数 2.普通函数指向非静态成员函数 3. 类外部的 类函数指针 指向普通函数 4. 类外部的 类函数指针 指向...5. 类内部的 函数指针 指向成员函数 (类似于第2条) 6. 类内部的 函数指针 指向普通函数
c++虚函数.C++中的虚函数的作用主要是实现了多态的机制。
这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调...
在程序加载的时候,类的非静态成员函数会放在内存的哪个位置?代码段?
C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数C++函数
C++将类的成员函数作为回调函数使用介绍
C++中的类中函数调用,只是基于简单的函数调用的例子
c++string类函数原型借鉴.pdf
关于tolua++的资料太少,这个通过实例让你知道如何通过tolua++和C++交互,简单明了。 通过5个文件来演示这个tolua++版 hello world hello.lua ,hello.h ,hello.pkg ,...这个程序实现了脚本调用C++类的成员函数方法
C++数学函数库,C/C++头文件一览,C++中数学函数
本文档详细介绍了C++友元函数及友元类,方便大家对比学习
c++钩子函数:copy hook c++调用钩子函数监视复制文件操作
C++常用函数大全,包含参数说明,函数分类列表
C++函数库大全C++函数库大全C++函数库大全
C++标准函数库 用于熟悉和了解C++函数