指向基类的基本多态指针

Basic polymorphic pointers to base classes

本文关键字:本多 多态 指针 基类      更新时间:2023-10-16

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

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

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

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

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

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

最简单的方法是直接赋值,不需要强制转换:

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);