假设我们有一个Class A
、Class B
派生自Class A
和Class C
派生自Class B
。
我创建了 的对象Class C
,但指针被分配给 A 类型的变量。
A *a = new C() ;
我怎么知道,如果a
是类型Class A
,Class B
还是Class C
在运行时?
我需要放置一些调试日志并打印对象的类型。
假设我们有一个Class A
、Class B
派生自Class A
和Class C
派生自Class B
。
我创建了 的对象Class C
,但指针被分配给 A 类型的变量。
A *a = new C() ;
我怎么知道,如果a
是类型Class A
,Class B
还是Class C
在运行时?
我需要放置一些调试日志并打印对象的类型。
(假设你的类是多态的)使用动态多态的重点是让运行时在不知道对象的确切类型的情况下做必要的事情。
一旦您开始编写取决于对象类型的代码,您就可以使您的代码更紧密地耦合。
但是,
如果您出于任何原因仍想知道类型,则可以使用typeid或dynamic_cast。
我认为没有内置的方法来确定这一点。我能想到的唯一选择是给 A 类一个虚函数。
class A {
public:
virtual int getType() const {
return 'A';
}
};
class B : public A {
public:
virtual int getType() const {
return 'B';
}
};
对于可能的类型问题,我深表歉意。从智能手机写作。
如果A
有任何虚函数,您可以使用 RTTI 获取描述其运行时类型的字符串:
A *a = could_return_an_object_of_any_derived_class();
cout << typeid(*a).name();
name()
不保证返回的字符串对人类友好,并且可能因编译器而异。不同类别之间的所有保证都是不同的。
通常这就是虚函数的用途:
struct A
{
virtual ~A() { }
virtual char const * name() const { return "Class A"; }
};
struct B : A
{
virtual char const * name() const { return "Class B"; }
};
struct C : B
{
virtual char const * name() const { return "Class C"; }
};
现在你可以说:
#include <iostream>
void print_me(A const & x)
{
std::cout << "I am " << x.name() << ".\n";
}
(或者a->name()
在你的例子中使用,但我不喜欢那个例子,因为通常你不应该使用裸指针或new
在 C++ 中。)