[英]Basic polymorphic pointers to base classes
虽然我已经在c ++工作了一段时间,但直到现在我还没有必要使用多态功能,而且我对它们非常感兴趣。
如果我有一个基类ClassA
而另一个ClassB
派生自它,我理解我可以在ClassA
中拥有virtual
成员函数,当在ClassB
实现时,将在ClassB
实例中调用,即使该实例指向使用ClassA
指针。 如果没有这个virtual
关键字,我假设基类实现在使用基类指针时占优势,但是对从子类实例化的对象进行操作,如果实际上ClassB
有自己的相同函数实现,这对我来说似乎有问题。在这种情况下实际上被忽略了。
这是对多态行为的正确理解吗?
现在真正的问题是如何使用指向基类的类来引用ClassB
。 我真的只能想到两种方式:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.