对于直到运行时才创建的方法的虚方法?

Sax*_*ute 0 c++ methods virtual runtime

我在理解C++中虚方法的目的时遇到了一些麻烦.如果方法不是在编译时创建的,那么方法是否必须是虚拟的?例如,如果你必须在运行时选择一个农场动物,那么所有动物的方法都需要是虚拟的,因为在用户选择一个之前你不知道它是否会被创建.如果我错了,请纠正我.

Dav*_*rtz 7

不,那是完全错误的.的方法必须是虚拟如果该方法需要根据对象的要被选择类型类型不是在编译时已知的.如果您的代码如下所示:

Animal *x;
if(y==2)
{
    x = new Animal();
    x->DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

编译器在运行时知道x类型是'Animal'.所以它知道要调用哪个版本的"DoSomething".但看看这段代码:

Animal *x;
if(y==1) x=new Zebra();
else if (y==2) x=GetSomeAnimal();
else x=new Giraffe();
x->DoSomething();
Run Code Online (Sandbox Code Playgroud)

这里x的类型在编译时是未知的.它可以是斑马,它可以是长颈鹿,也可以是GetSomeAnimal函数返回的任何类型的动物.没有办法知道DoSomething应该调用的调用Zebra::DoSomething,Giraffe::DoSomething还是其他完全调用.所以Animal::DoSomething需要虚拟化.

只是为了表明它与将要创建的内容无关,请考虑以下事项:

void MyFunction(Animal &x)
{
    x.DoSomething();
}

void MyOtherFunction(int x)
{
   Giraffe g;
   Zebra z;
   if(x==2) MyFunction(g);
      else MyFunction(f);
}
Run Code Online (Sandbox Code Playgroud)

这里非常清楚,将创建一个Giraffe和一个Zebra.但如果Animal::DoSomething不是虚拟的话,MyFunction将会同时召唤Animal::DoSomething两次,而不是Giraffe::DoSomething长颈鹿和Zebra::DoSomething斑马.(当然,如果这是你想要的,请不要将该方法设为虚拟.)