基础多态指向基类的指针

5

虽然我已经在C++领域工作了一段时间,但是直到现在我还没有需要使用多态特性的必要,我对它们非常感兴趣。

如果我有一个基类ClassA,另一个类ClassB从它派生而来,我知道我可以在ClassA中有一个virtual成员函数,当在ClassB中实现时,即使该实例使用ClassA指针指向,也会在ClassB实例中调用。没有这个virtual关键字,我认为在使用基类指针时,基类的实现将占主导地位,但实际上操作的对象是从子类实例化的,如果ClassB有自己的相同函数的实现,那么在这种情况下它会被忽略,这对我来说似乎是不合逻辑的。

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

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

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

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


相关链接:https://dev59.com/eG025IYBdhLWcg3wsIIU - Michael Kristofik
1个回答

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

的确,我只是碰巧在字典中查了一个单词,这个单词是“优雅”,当我看到它的定义时,我不禁瞪大了眼睛,因为它实际上就是你提供的代码片段! - johnbakers
+1 是指出动态分配和指针与多态性是正交的(即使它们经常一起使用)的。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接