【发布时间】:2012-08-23 20:08:53
【问题描述】:
考虑以下程序:
class Base
{
private:
int m_nID;
public:
Base()
{
m_nID = ClassID();
}
// ClassID returns a class-specific ID number
virtual int ClassID() { return 1; }
int GetID() { return m_nID; }
};
class Derived: public Base
{
public:
Derived()
{
}
virtual int ClassID() { return 2; }
};
int main()
{
Derived cDerived;
cout << cDerived.GetID();
return 0;
}
在上面的例子中,派生的 id 竟然是 1 而不是 2。我已经找到了关于同一个问题的类似问题here。但我不明白的是,如果这是错误的,那怎么办我们应该识别一个(派生的)类成员并使用它?我的意思是假设我想为每个类(基类、第一个派生类、第二个派生类,它是基类的派生类)专用一个唯一的 id 或类型名类或第二个派生类等),在这方面我该如何继续行动? 我认为正确的方法是在实例化任何类对象时在构造函数中分配一个 id/name,以便立即知道类型。上述方法失败了,在这方面我还有哪些其他选择?
【问题讨论】:
-
构造完成后,
ClassID返回你所需要的。 -
@BoPersson:实际上这个问题有很大不同。我不是在问为什么会这样,我是在问我如何通过其他方法使用这种方法来实现我想要实现的目标。
-
@karolyHarvath: 如果我使用这样的情况怎么办:void Foo(baseClass bar);在 Foo() 函数内部,根据对象类型,我有不同的操作。假设我有一个 Person 类和两个名为:Male 和 Female 的派生子类。有一个这样的函数:void Foo(Person person ){ if ( person.ClassID == 1 ) cout
标签: c++ constructor virtual