虽然我已经在c ++工作了一段时间,但直到现在我还没有必要使用多态功能,而且我对它们非常感兴趣.
如果我有一个基类ClassA而另一个ClassB派生自它,我理解我可以拥有virtual成员函数ClassA,当实现时ClassB,ClassB即使该实例指向使用ClassA指针,也会在实例中调用它.如果没有这个virtual关键字,我假设基类实现在使用基类指针时会占上风,但是对从子类实例化的对象进行操作,如果事实上ClassB它有自己的相同函数的实现,那对我来说似乎有问题.在这种情况下被有效地忽略了.
这是对多态行为的正确理解吗?
现在真正的问题是你如何引用ClassB指针是基类.我真的只能想到两种方式:
static_cast并转换对象并将其指定给指向基类的指针.这些是生成基类对象的基类指针的两种主要技术吗?
最简单的方法是简单地分配它,不需要演员:
ClassA *ptrA = new ClassB;
Run Code Online (Sandbox Code Playgroud)
你是否正确需要virtual关键字才能启用多态行为.这是思考它的一种方式.C++在对象的静态类型上运行.当你调用时ptrA->foo(),指针的类型是ClassA*.如果没有声明该函数virtual,那么它将盲目地调用ClassA该函数的版本.别无选择.但如果foo()是virtual,那么就知道要停下来问:"等等,我真的是什么类型的?" 在这种情况下的答案是ClassB,所以它将调用ClassB版本.
另请注意,您不需要指针来实现此目的.您将看到多态行为的另一种常见方式是通过函数调用:
void bar(ClassA &aObj)
{
aObj.foo();
}
// ...
ClassB bObj;
bar(bObj);
Run Code Online (Sandbox Code Playgroud)