使用继承函数打印派生类的类名

时间:2017-05-17 19:56:15

标签: c++ inheritance

有没有办法打印带有继承函数的派生类的类名而不在派生类中覆盖该函数?

class A {
public:
    virtual void print() { printf("%s", __PRETTY_FUNCTION__); }
};

class B : public A {};

int main() {
    B b;

    b.print() // should yield "B::print()" but yields "A::print()"
}

我问我可以在重写函数中调用A::print()来打印与父类相关的属性,但包括当前的类名。

1 个答案:

答案 0 :(得分:0)

__PRETTY_FUNCTION__创建一个编译时确定的字符串。 A并不知道(而且,关键的是,并不关心)是否真正最终从中得到了什么。它只是创建一个打印出"virtual void A::print()"

的函数

如果您希望这样的函数正确识别调用它的类的名称,则可以选择将名称维护为与基类关联的可查询对象。

class A {
public:
    virtual void print() {printf("(%s) : %s", get_name(), __PRETTY_FUNCTION__);}
    virtual const char * get_name() {return "A";}
};

class B : public A {
public:
    virtual const char * get_name() {return "B";}
};

使用typeid获取动态名称的评论中的建议可能也有效,但我之前从未使用typeid,所以我可以& #39; t个人保证其有效性。