你试图在C++中做的事情是不可能的。在C++中,变量具有在编译时定义的固定类型,它们不能在运行时更改类型。但C++提供了多态性(看起来像动态类型),允许派生类型实现基类功能,但访问类型特定方法的唯一方法是将类型绑定到基类,如果您将类型绑定到派生类型,则只能调用该类型的实现*:
class Base
{
public: virtual void Func () = 0;
};
class C1 : public Base
{
public: virtual void Func () {}
};
class C2 : public Base
{
public: virtual void Func () {}
};
void SomeFunc ()
{
C1 *c1 = new C1;
C2 *c2 = new C2;
Base *b;
b = c1;
b->Func ();
b = c2;
b->Func ();
}
看起来b
的类型已经改变,但它的实际类型仍然是一个Base *
,并且只能被赋值为c1
和c2
,因为它们共享一个基类Base
。也可以反过来:
Base *b = new C1;
C1 *c1 = dynamic_cast <C1 *> (b);
但是它需要使用 dynamic_cast
,而这需要一些称为 RTTI(运行时类型信息)的东西,它为编译代码提供了一种检查 b
实际上是否指向 C1
类型的方法。如果您执行以下操作:
Base *b = new C2;
C1 *c1 = dynamic_cast <C1 *> (b);
c1
将成为空指针,而不是 b
。但是 C1 和 C2 仍然必须有一个共同的基类才能使其工作。这是不合法的:
class Base {....}
class C1 : public Base {....}
class C2 {....} // not derived from Base!
Base *b = new C2; // no way to convert C2 to Base!
C2 *c2 = new C2;
b = dynamic_cast <Base *> (c2); // still won't work, C2 not a Base
b = new C1; // fine, C1 is a Base
C1 *c1 = new C1;
b = c1; // again, fine
c1 = dynamic_cast <C1 *> (b); // fine, C1 is a derived type of Base, this will work
c2 = dynamic_cast <C2 *> (b); // won't work, C2 is not a derived type of Base
如果C1和C2有关(比如CSquare和CCircle),那么一个共同的基类是有意义的。如果它们没有关系(比如CRoad和CFood),那么一个共同的基类就没什么帮助了(虽然可以做到,但不太合理)。前者(共同的基类)已经在其他答案中得到了很好的描述。如果你需要做后者,那么你可能需要重新思考代码结构,以便让你能够做前者。
如果您能扩展一下您想要对x做什么,那将会有所帮助。由于x是一个容器,您只想进行与容器相关的操作吗?
当然,在C++中,事情从来都不那么简单,有很多事情可能会使问题变得复杂。例如,派生类型可能会将公共基类虚方法私有化:
示例:
class B
{
public:
virtual void F () = 0;
};
class C : public B
{
private:
virtual void F () { .... }
};
C *c = new C;
B *b = c;
b->F ();
c->F ();
x
的类型,那么如何处理x[key]
,因为它可以是C1
或C2
类型,每种类型都有不同的成员集合(且它们的名称不同)。 - Nawazkey
是long
类型。 - Vijay Mathewx[key]
的类型是C1
或C2
中的一个。 - Nawaz