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;
}

^^ 为什么它不起作用?我在哪里可以找到有关虚拟方法如何真正工作的信息?

4

3 回答 3

14

这种效果称为“切片”。

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

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

于 2010-08-30T10:58:53.440 回答
4

尝试以下操作:

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

在您的代码中,您将对象的一部分复制Childb. 这就是所谓的对象切片

于 2010-08-30T10:59:19.697 回答
1

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

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

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

没有指针,调用是静态绑定的,即使它是一个虚函数调用。

编辑2:

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

于 2010-08-30T10:58:41.147 回答