基类的基本多态指针

时间:2013-04-04 13:22:09

标签: c++ polymorphism

虽然我已经在c ++工作了一段时间,但直到现在我还没有必要使用多态功能,而且我对它们非常感兴趣。

如果我有一个基类ClassA而另一个ClassB派生自它,我理解我可以在virtual中拥有ClassA成员函数,当{ {1}}将在ClassB实例中调用,即使该实例指向使用ClassB指针。如果没有这个ClassA关键字,我假设基类实现在使用基类指针时占优势,但是对从子类实例化的对象进行操作,这对我来说实际上是virtual它有自己的相同功能的实现,在这种情况下被有效忽略。

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

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

  1. 在实例化时创建指针,使用返回基类指针的函数,同时使用子类的构造函数实际为子类分配内存。 (这样的创建函数是否具有通用名称?)
  2. 使用ClassB投射对象并将其指定给指向基类的指针。
  3. 这些是生成基类对象的基类指针的两种主要技术吗?

1 个答案:

答案 0 :(得分:9)

最简单的方法是简单地分配它,不需要演员:

ClassA *ptrA = new ClassB;

您是否正确需要virtual关键字才能启用多态行为。这是思考它的一种方式。 C ++在对象的静态类型上运行。当您致电ptrA->foo()时,指针的类型为ClassA*。如果该函数未声明为virtual,那么它将盲目地调用ClassA的函数版本。别无选择。但是如果foo()virtual,那么它就知道要停下来问:“等等,我真的是什么类型的?”在这种情况下,答案是ClassB,因此它会调用ClassB的版本。

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

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

// ...
ClassB bObj;
bar(bObj);