我想问一下,当我使用没有指针的虚函数时会发生什么?例如:
#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;
}
^^为什么不起作用? 我在哪里可以找到关于虚拟方法如何真正起作用的东西?
答案 0 :(得分:14)
此效果称为“切片”。
Parent b = Child(2); // initializes a new Parent object using part of Child obj
在C ++中,动态类型可能只与引用或指针的静态类型不同。你有一个直接的对象。所以,你的怀疑本质上是正确的。
答案 1 :(得分:4)
答案 2 :(得分:1)
仅当通过适当的引用或适当的指针调用虚函数时,才启用虚函数机制。请注意,虚构函数调用机制在构造函数/析构函数中或使用::运算符时被抑制。
如果代码如下所示,将启用虚拟功能机制。
Child c;
Parent &a = c;
a.f();
如果没有指针,则调用是静态绑定的,即使它是虚函数调用。
编辑2:
$ 10.3 / 6 - [注:解释 虚函数的调用取决于 关于它的对象的类型 被称为(动态类型),而 对一个电话的解释 非虚拟成员函数取决于 仅限指针的类型或 表示该对象的引用( 静态类型)(5.2.2)。 ]