题
我想问当我使用虚拟功能没有指针时会发生什么?例如:
#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;
}
^^为什么不起作用?我在哪里可以找到有关虚拟方法的真正工作方式的信息?
解决方案
这种效果称为“切片”。
Parent b = Child(2); // initializes a new Parent object using part of Child obj
在C ++中,动态类型可能仅与引用或指针的静态类型不同。您有一个直接对象。因此,您的怀疑本质上是正确的。
其他提示
仅当通过适当的参考或适当的指针调用虚拟函数时,才启用虚拟功能机制。请注意,虚拟函数调用机制在构造函数/驱动器中被抑制,或者在使用::操作员时被抑制。
如果代码如下所示,将启用虚拟功能机制。
Child c;
Parent &a = c;
a.f();
没有指针,即使是虚拟函数调用,呼叫也是静态绑定的。
编辑2:
$ 10.3/6 - [注意:虚拟函数呼叫的解释取决于其称为对象的类型(动态类型),而非虚拟成员函数的呼叫的解释仅取决于类型指示该对象(静态类型)(5.2.2)的指针或参考。这是给予的
不隶属于 StackOverflow