boost::function绑定继承派生类
时间:2011-12-18
来源:互联网
以下代码问题:
boost::function<void(CBase*, const std::string&)> Func1; //why can't be CBase
CDerive derive;
Func1 = &CDerive::print;
Func1(dynamic_cast<CBase*>(&derive), "3");
问题: 为什么不能讲派生类指针转化为基类指针,然后调用Func1(dynamic_cast<CBase*>(&derive), "3");
#include <iostream>
#include <string>
#include <boost/function.hpp>
#include <vector>
class CBase {
public:
CBase(){}
virtual ~CBase(){}
public:
virtual void print(const std::string& vInfo) {std::cout << "base class member print function:" << vInfo << std::endl;}
};
class CDerive : public CBase {
public:
CDerive(){}
virtual ~CDerive(){}
public:
virtual void print(const std::string& vInfo) {std::cout << "derive class member print function:" << vInfo << std::endl;}
};
void globalPrint(const std::string& vInfo)
{
std::cout << "global print function:" << vInfo << std::endl;
}
class FunctionObj {
public:
FunctionObj(){}
~FunctionObj(){}
public:
void operator()(const std::string& vInfo) {std::cout << "function object print function:" << vInfo << std::endl;}
};
int main (int argc, char * const argv[]) {
// insert code here...
std::vector<boost::function<void(const std::string&)> > FuncVec;
FuncVec.push_back(&globalPrint);
FuncVec.push_back(FunctionObj());
FuncVec[0]("0");
FuncVec[1]("1");
boost::function<void(CBase*, const std::string&)> Func0;
Func0 = &CBase::print;
CBase base;
Func0(&base, "2");
boost::function<void(CBase*, const std::string&)> Func1; //why can't be CBase
CDerive derive;
Func1 = &CDerive::print;
Func1(dynamic_cast<CBase*>(&derive), "3");
return 0;
}
boost::function<void(CBase*, const std::string&)> Func1; //why can't be CBase
CDerive derive;
Func1 = &CDerive::print;
Func1(dynamic_cast<CBase*>(&derive), "3");
问题: 为什么不能讲派生类指针转化为基类指针,然后调用Func1(dynamic_cast<CBase*>(&derive), "3");
#include <iostream>
#include <string>
#include <boost/function.hpp>
#include <vector>
class CBase {
public:
CBase(){}
virtual ~CBase(){}
public:
virtual void print(const std::string& vInfo) {std::cout << "base class member print function:" << vInfo << std::endl;}
};
class CDerive : public CBase {
public:
CDerive(){}
virtual ~CDerive(){}
public:
virtual void print(const std::string& vInfo) {std::cout << "derive class member print function:" << vInfo << std::endl;}
};
void globalPrint(const std::string& vInfo)
{
std::cout << "global print function:" << vInfo << std::endl;
}
class FunctionObj {
public:
FunctionObj(){}
~FunctionObj(){}
public:
void operator()(const std::string& vInfo) {std::cout << "function object print function:" << vInfo << std::endl;}
};
int main (int argc, char * const argv[]) {
// insert code here...
std::vector<boost::function<void(const std::string&)> > FuncVec;
FuncVec.push_back(&globalPrint);
FuncVec.push_back(FunctionObj());
FuncVec[0]("0");
FuncVec[1]("1");
boost::function<void(CBase*, const std::string&)> Func0;
Func0 = &CBase::print;
CBase base;
Func0(&base, "2");
boost::function<void(CBase*, const std::string&)> Func1; //why can't be CBase
CDerive derive;
Func1 = &CDerive::print;
Func1(dynamic_cast<CBase*>(&derive), "3");
return 0;
}
作者: lpcudaid 发布时间: 2011-12-18
到底几个问题啊?
作者: taodm 发布时间: 2011-12-18
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28