2013-04-04 48 views
5

虽然我在C++中工作了一段时间,但直到现在我还没有必要使用多态特性,而且我对它们非常感兴趣。基本类的基本多态指针

如果我有一个基类ClassA和另一ClassB提炼出来的,我知道我可以有virtual成员函数ClassA,在ClassB实施后,将在即使实例指出在ClassB实例调用使用ClassA指针。没有这个virtual关键字,我认为在使用基类指针时基类实现将占上风,但是它正在对从子类实例化的对象进行操作,这在我看来是有疑问的,实际上ClassB有其自己的实现相同的功能在这种情况下,这被有效地忽略了。

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

现在真正的问题是如何使用指向基类的指针来引用ClassB。我真的可以只考虑两种方式:

  1. 在实例化时创建的指针,使用返回一个基类指针,而实际上是子类分配内存,而不是使用子类的构造函数。 (这样的创建函数是否具有共同名称?)
  2. 使用static_cast投射对象并将其分配给指向基类的指针。

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

+0

相关:http://stackoverflow.com/q/5854581/46821 – 2013-04-04 13:25:48

回答

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

+1为了简单:) – scones 2013-04-04 13:29:38

+0

实在的,我只是巧合的是在字典中查找了一个单词,这个词很优雅*,而且当定义实际上是您在上面提供的确切代码片段时,我做了一个双重处理! – johnbakers 2013-04-04 13:31:26

+0

+1指出动态分配和指针是正交于多态(即使经常一起使用)。 – 2013-04-04 14:28:35