指向基类的基本多态指针
Basic polymorphic pointers to base classes
虽然我已经在c++中工作了一段时间,但直到现在我还没有需要使用多态特性,并且我对它们非常感兴趣。
如果我有一个基类ClassA
和另一个ClassB
派生自它,我知道我可以在ClassA
中拥有virtual
成员函数,当在ClassB
中实现时,即使该实例使用ClassA
指针指向,也会在ClassB
实例中调用。如果没有这个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);
相关文章:
- 多态性和功能结合
- 具有默认模板参数的多态类的模板推导失败
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 多态二进制函数
- 访问存储在向量C++中的结构的多态成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 将 std::allocate_shared 与多态资源分配器一起使用
- 通过switch和static_cast访问多态对象的运行时类型
- C++boost序列化多态性问题
- 多态杆件变量 - 类设计
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- Doees the 'this' 指针参与虚函数的多态行为
- C++ 在堆栈中包含多态属性的类对象存储
- 基类和派生类的多态赋值运算符
- 转身多态对象
- 如何在基类指针向量的元素上应用重载的多态函数
- 具有智能指针的多态性
- Qt中的多模态窗口
- VC6中的多模态对话框