不,那是完全错误的.的方法必须是虚拟如果该方法需要根据对象的要被选择类型和类型不是在编译时已知的.如果您的代码如下所示:
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斑马.(当然,如果这是你想要的,请不要将该方法设为虚拟.)
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |