C++中virtual的作用

今天研究了C++virtual关键字的作用,发现这是C++中继承和多态的一个关键要素。以前一直不知道virtual有什么用,只是照着书抄设计模式,今天才知道,设计一个层次关系,virtual是必不可少的。

 

    考虑以下几个类声明:

 

class Animal

{

char* ap;

public:

Animal();

virtual ~Animal();

virtual void foo();

};

 

class Dog : public Animal

{

char* ap;

public:

Dog();

~Dog();

void foo();

};

    Dog是继承于基类Animal的派生类。

   

    看如下的main()函数:

   

int main()

{

Animal* pa = new Dog();

pa->foo();

delete pa;

return 0;

}

 

    第一步,pa被声明为Animal,但是实例化的时候是用的派生类Dog(实际上这是众多设计模式采用的共同方法,基类的变量以某个子类的形式实例化);

    第二步,pa->foo()究竟调用的是Animalfoo()函数,还是Dogfoo()函数呢?

    第三步,在删除pa的时候,众所周知我们需要先调用Dog的析构函数,再调用Animal的析构函数,那么,编译器会知道应该这样调用吗?

 

    答案就在标记为红色的virtual上。理论上说,virtual表示一个“晚绑定”的概念,也就是说,在程序实际运行的时候,才确定调用哪个函数(这个概念我一直理解的比较模糊)。编译器只保证这个函数的存在而不管在哪。

   

   但是从这个例子的测试可以看出,如果不加两个virtual,第二步调用的将是Animalfoo()函数,第三步将只会调用Animal的析构函数。直观的说,编译器将不会找到正确的派生类里面的方法并加以调用。pa将以它所声明的类型而存在。更直观的说,不加virtual,你就甭想继承了。

   

    特殊的是,只有构造函数不用加virtual,应该说,加不加virtual都是一样的。

  

   所以,C++一切神奇的继承和多态都在这个神奇的virtual中实现。如果哪位达人教我VTABLE和晚期绑定是啥(用我可以理解的语言),将不胜感激~

 

你可能感兴趣的:(C/C++)