2012-07-23 33 views
0

我一直在环顾QMetaData和QObject调用className()。我想在我自己的班级复制这个,但我不知道QT是如何做到的。我的意思是,我做以下,但不输出正确类(忽略任何语法错误):Qt QMetaData类名执行

#include <iostream> 

#define CLASS(name)    \ 
    std::string className() { \ 
     return #name;   \  
    }       

class A { 
public: 
    CLASS(A) 

    A(){} 
    ~A(){} 

    void output() { 
     std::cout << className() << std::endl; 
    } 
}; 

class B: public A{ 
public: 
    CLASS(B) 
    B(){} 
    ~B(){} 
}; 

int main() { 
    B b; 
    b.output(); // This obviously outputs "A" but I would 
        // like it to output "B" from the base class 
        // function 
    return 0; 
} 

的Qt如何拥有它,你不必添加任何代码只是Q_OBJECT宏和即使基类具有输出函数(在Qt中,我的意思是QObject :: debugObjectTree()),也可以从基类中获得派生类的className。 Qt如何在不向派生类添加任何额外代码(可能是宏)的情况下实现此效果,其中基类可以输出派生类的类名?

在此先感谢。

回答

1

为此,您需要dynamic dispatch(即C++中的虚函数)。

std::string className()前将宏添加virtual

#define CLASS(name)    \ 
virtual std::string className() { \ 
    return #name;   \  
} 

http://ideone.com/Kr0Sc

+0

谢谢!我不知道解决方案会很简单!我忘了虚拟允许你重写成员函数。 – user654628 2012-07-23 14:55:46