虽然我已经在 C++ 领域工作了一段时间,但直到现在我才需要使用多态特性,而且我对它们非常感兴趣。
如果我有一个基类ClassA
和另一个ClassB
从中衍生出来,我明白我可以拥有virtual
中的成员函数ClassA
即,当实施于ClassB
,将被称为ClassB
实例,即使该实例是使用 a 指向的ClassA
指针。没有这个virtual
关键字,我认为使用基类指针时基类实现将占上风,但对从子类实例化的对象进行操作,这对我来说似乎是有问题的,如果事实上ClassB
有自己的相同功能的实现,在这种情况下实际上会被忽略。
这是对多态行为的正确理解吗?
现在真正的问题是你如何引用ClassB
使用指向基类的指针。我真的只能想到两个办法:
- 在实例化时创建指针,使用返回基类指针的函数,同时使用子类的构造函数实际为子类分配内存。 (这样的创建函数有通用的名字吗?)
- 使用以下方式投射对象
static_cast
并将其分配给指向基类的指针。
这是生成指向子类对象的基类指针的两种主要技术吗?
最简单的方法是简单地分配它,不需要强制转换:
ClassA *ptrA = new ClassB;
你是对的,你需要virtual
关键字以启用多态行为。这是一种思考方式。 C++ 对对象的静态类型进行操作。你打电话时ptrA->foo()
,指针的类型是ClassA*
。如果该函数没有声明virtual
,然后它会盲目调用ClassA
的函数版本。没有其他选择。但如果foo()
is virtual
,然后它知道停下来问,“等等,我到底是什么类型的?”这种情况下的答案是ClassB
,所以它会调用ClassB
的版本。
另请注意,您不需要指针来实现此目的。您将看到多态性的另一种常见方式是通过函数调用:
void bar(ClassA &aObj)
{
aObj.foo();
}
// ...
ClassB bObj;
bar(bObj);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)