5

虽然我已经在 c++ 中工作了一段时间,但直到现在我才需要使用多态特性,而且我对它们非常感兴趣。

如果我有一个基类ClassA并且另一个ClassB派生自它,我知道我可以拥有virtual成员函数ClassA,当在 中实现时,即使该实例使用指针指向ClassB,也会在实例中调用。如果没有这个关键字,我认为在使用基类指针时基类实现会占上风,但要对从子类实例化的对象进行操作,这对我来说似乎是有问题的,如果实际上它自己实现了相同的函数在这种情况下有效地忽略了。ClassBClassAvirtualClassB

这是对多态行为的正确理解吗?

现在真正的问题是如何ClassB使用指向基类的指针来指代。我真的只能想到两种方法:

  1. 在实例化时创建指针,使用返回基类指针的函数,同时实际为子类分配内存,使用子类的构造函数。(这样的创建函数有通用名称吗?)
  2. 使用对象转换static_cast并将其分配给指向基类的指针。

这是生成指向子类对象的基类指针的两种主要技术吗?

4

1 回答 1

9

最简单的方法是简单地分配它,不需要强制转换:

ClassA *ptrA = new ClassB;

你是正确的,你需要virtual关键字来启用多态行为。这是思考它的一种方法。C++ 对对象的静态类型进行操作。调用ptrA->foo()时,指针的类型是ClassA*。如果该函数未声明virtual,那么它将盲目地调用ClassA该函数的版本。没有其他选择。但如果foo()virtual,它就知道停下来问:“等等,我到底是什么类型的人?” 这种情况下的答案是ClassB,所以它会调用ClassB's 版本。

另请注意,您不需要指针来实现这一点。您将看到多态性的另一种常见方式是通过函数调用:

void bar(ClassA &aObj)
{
    aObj.foo();
}

// ...
ClassB bObj;
bar(bObj);
于 2013-04-04T13:28:35.340 回答