多虚函数表指针的一点困惑
以前,学习C++的多态时,从网上搜了N多的资料,认识并熟悉了虚函数表,但是,对于虚表指针的认识也只是人云亦云,但是,随着学习的深入,最近又回去复习了多态,并又看了虚表指针,如这个经典的帖子
http://blog.csdn.net/hairetz/article/details/4137000
但是,我始终有这样的问题,在该帖子的第一张图中,(事先声明, 整篇帖子都是非虚拟继承)编译器根本就没必要维护一张虚函数表,因为在继承的类层次结构上看,先从base的角度看,他自己的函数,无论是vir还是非vir函数,都应当统统当做普通成员函数来对待,因为自己的虚函数,对自己是没有多态的,一个类所声明的虚函数,语义上,是表明在他的子类中才会表现出多态,因此,只有必要在子类中维护虚表以提供多态机制即可,而没有必要画蛇添足,在父类中为自己的虚函数添加虚表,你能解释,在父类中,为自己的虚函数添加虚表的目的是什么吗?语义上表明什么?难道自己调用自己的函数,还要几步跳转,这既浪费空间,又浪费效率。
我始终认为,从类的层次结构上看, 以及从虚函数的语义上看,一个类,没有必要为自己的虚函数维护虚表,统统当做普通成员函数对待,只需要在派生类中维护虚表,因为前面已经提到过,一个类的虚函数不是给自己表达多态的语义的,而是给派生类表达多态的语义,因此,就只需要派生类中提供虚表即可。
但是,好多的博文中,都出现了这种情况,一旦一个类有虚函数,那么这个类就会产生一枚虚表指针,指向这些虚函数,如果这真是事实,那么原因,到底是编译器为了追求简单,对虚函数采取统一处理?还是,编译器都不理解虚函数语义上是在哪一个类层次上才会表现出多态。
希望有兴趣的讨论一下