2010-08-30 66 views
2

我想问一下当我使用没有指针的虚函数时会发生什么?例如:为什么这种方法不像我期待的那样虚拟?

#include <iostream> 
using namespace std; 
class Parent 
{ 
public: 
    Parent(int i) { } 
    virtual void f() { cout<<"Parent"<<endl; } 
}; 

class Child : public Parent 
{ 
public: 
    Child(int i) : Parent(i) { } 
    virtual void f() { Parent::f(); cout<<" Child"<<endl; } 
}; 

int main() 
{ 
    Parent a(2); 
    Parent b = Child(2); 
    a.f(); 
    b.f(); 
    return 0; 
} 

^^它为什么不起作用? 我在哪里可以找到关于虚拟方法真正起作用的内容?

+1

另一个问题(可能是众多问题之一)解决相同的问题,你可以阅读进一步的洞察力:http://stackoverflow.com/questions/2931423/problem-overridding-virtual-function/2931438 – 2010-08-30 11:03:43

+0

@泰勒 - 这个问题基本上是一个完全相同的副本。投票结束。 – Omnifarious 2010-08-30 11:09:04

+0

代码是一样的;基本假设不是。这里,假定问题出现在虚函数的调用中。链接的问题假定未能进入虚拟功能的_overriding。 (当然,两者的真正原因在于切片)。所以我倾向于说它不完全相同。 – MSalters 2010-08-30 12:00:55

回答

14

这种效应被称为“切片”。

Parent b = Child(2); // initializes a new Parent object using part of Child obj 

在C++中,动态类型可能仅与引用或指针的静态类型不同。你有一个直接的对象。所以,你的怀疑基本上是正确的。

+4

这是疯狂获得投票,但这不是一个很好的答案。基里尔提供了一个参考,看看。 – Potatoswatter 2010-08-30 11:06:52

+0

+1:对于那条评论 – Chubsdad 2010-08-30 11:07:59

+0

我在想,并着手自己的回答,然后阅读链接,并在结尾处意识到答案与我写的一样好。 :-)这个问题应该作为一个确切的重复来关闭。 – Omnifarious 2010-08-30 11:11:19

1

只有通过适当的引用或适当的指针调用虚拟函数时才启用虚拟函数机制。请注意,虚构函数调用机制在构造函数/析构函数中或使用::运算符时被抑制。

如果代码如下所示,虚函数机制将被启用。

Child c; 
Parent &a = c; 
a.f(); 

没有指针,即使是虚拟函数调用,该调用也是静态绑定的。

编辑2:

$ 10.3/6 - [注: 解释一个虚拟函数的调用取决于 于它 被调用的对象的类型(动态型),而 非虚拟成员函数的呼叫的解释仅取决于指针类型的 或取决于表示该对象的参考( 静态类型)(5.2.2)。 ]

4

尝试以下操作:

std::auto_ptr<Parent> b = new Child(2); 

在你的代码复制Child对象的一部分b。这就是所谓的object slicing

相关问题