运行时判断自身是属于哪个类
一组类有继承关系 CBase; CDerived:CBase; 函数CBase::ToWhomIBelong()判断当前对象是属于CBase还是CDerived,请问如何实现?好像有个什么机制的。谢谢
[解决办法]
typeid ???
[解决办法]
多态
[解决办法]
看看深入浅出MFC,最开始就讲了动态识别类型
[解决办法]
函数可以,类好像没有办法,每个类里加一句[color=#84c787]话加打印一下吧
- C/C++ code
#[/color][color=#84c887]i[/color][color=#85c887]nclu[/color][color=#85c886]de <io[/color][color=#86c886]stream>
/[/color][color=#87c886]/s[/color][color=#87c885]hared_[/color][color=#87c985]pt[/color][color=#88c985]r
#inclu[/color][color=#88c984]de [/color][color=#89c984]"boost/sh[/color][color=#8ac984]ared_[/color][color=#8ac983]pt[/color][color=#8aca83]r.h[/color][color=#8bca83]pp"
clas[/color][color=#8cca83]s A
[/color][color=#8cca82]{
publ[/color][color=#8dca82]ic:
v[/color][color=#8dcb82]oid [/color][color=#8ecb81]fun()
{
[/color][color=#8fcb81]std::[/color][color=#8fcb80]cout [/color][color=#90cb80] < < [/color][color=#90cc80]__FUN[/color][color=#91cc80]CDNA[/color][color=#91cc7f]ME__ <[/color][color=#92cc7f] < std::end[/color][color=#93cc7f]l[/color][color=#93cc7e];
[/color][color=#93cd7e]std::[/color][color=#94cd7e]cout < < [/color][color=#94cd7d]"ok[/color][color=#95cd7d]..." < < s[/color][color=#96cd7d]td:[/color][color=#96ce7d]:e[/color][color=#96ce7c]ndl;
[/color][color=#97ce7c]}
};
int [/color][color=#98ce7c]m[/color][color=#98ce7b]ain()
{
[/color][color=#99ce7b]b[/color][color=#99cf7b]oost::[/color][color=#99cf7a]sh[/color][color=#9acf7a]ared_ptr <[/color][color=#9bcf7a]A> p(n[/color][color=#9bcf79]ew A[/color][color=#9ccf79]([/color][color=#9cd079]));
p->f[/color][color=#9dd079]un([/color][color=#9dd078]);
re[/color][color=#9ed078]turn 0;
}[/color]
[解决办法]
RUNTIME_CLASS() + IsKindOf()
[解决办法]
- C/C++ code
#include <iostream>#include <string>using namespace std;class CBase{public: void ToWhomIBelong() { cout << "I am " << showCn() << endl; };private: virtual string showCn() { return string("CBase"); }};class CDerived: public CBase{private: string showCn() { return string("CDerived"); }};int main(){ CBase *pb= new CBase(); CBase *pd= new CDerived(); cout<<"pb:"; pb->ToWhomIBelong(); cout<<"pd:"; pd->ToWhomIBelong(); delete pd; delete pb; return 0;}
[解决办法]
- C/C++ code
class Base{public: virtual ~Base() {}; static bool IsBaseObject(Base* pB);};class Derived : public Base{};bool Base::IsBaseObject(Base* pB){ Derived* pD = dynamic_cast<Derived*>(pB); if(pD != NULL) return false; else return true;}int _tmain(int argc, _TCHAR* argv[]){ Base* p1 = new Base(); Base* p2 = new Derived(); bool bBaseObject1 = Base::IsBaseObject(p1); bool bBaseObject2 = Base::IsBaseObject(p2); delete p1; delete p2; return 0;}
[解决办法]