0

我理解为什么在将派生类分配给基类指针时只能调用基类函数的原理。从我对虚表的理解来看,原因是因为只有基类虚函数指针被放入虚表中,所以只能调用它们,但是如果基类指针指向派生类,当派生类构造函数被称为基类时类虚函数替换为虚表中的覆盖。

但是我的观点是:如果派生类中有一个非虚拟成员函数,该函数用于虚拟基类成员函数的派生类覆盖中,是否会有问题。

我的理论不应该存在,因为它的函数访问问题不在函数内跳转,通过将指针分配给新的 DerivedClass,您正在为所有派生类分配空间,因此允许使用指针访问虚拟覆盖函数到保存在 v-table 中的虚函数。从那里开始的所有动作就好像你只是在一个派生类对象中,所以它可以跳转到它想要的任何函数。

这个对吗?或者使用基类指针作为跳转引用的函数跳转是否存在问题(如数组:*pointer + 2 for function),是如何调用成员函数的?

如果这(不是我的意图,但仍然)没有问题,那么理论上是否有可能拥有一个虚拟函数,比如一个 int 参数。然后在派生类覆盖虚函数内的 switch 语句,根据传入的 int 调用特定的派生类函数,从而解决“仅调用基类定义的虚函数”问题?

例如。(没有构造函数等的骨架和声明/定义的分离)

class A
{
   protected:
          virtual void AFunc() ; 

} ;     

class B : public A
{
   public:
          virtual void AFunc() { BSpecificFunc() ;} // doable?
   /* if thats the case why not:
          virtual void Sfunv(int temp)
           {
              switch(temp)
                   {
                     case 1 : BSpecificFunca() ; break;
                     case 2:  BSpecificFuncb() ; break;
                     etc.  
                    }
            }
       */
   private:
          void BSpecificFunc() ; 
          void BSpecificFunca() ;
          void BSpecificFuncb() ;
          void BSpecificFuncc() ;

} ;  


int main()
{
   A *pBaseClass = new B;

   pBaseClass->AFunc(); //Will there be any issues doing this?

}

目前处于设计阶段,这就是为什么我一直保持良好和理论化的原因。

4

2 回答 2

1

如果你打电话pBaseClass->AFunc()并且pBaseClass实际上是 aB那么B::AFunc()就是被调用的。IfpBaseClass实际上是一个AthenA::AFunc()是被调用的。这就是多态性的全部意义所在。

做什么B::AFunc()取决于B,它没有理由不能调用其他函数或使用B其中不存在的数据A

于 2013-08-01T20:20:01.620 回答
0

应该没有问题 - 对非虚拟函数的调用已经解决。这样想:B::AFunc()被编译成类似call BSpecificFunc. 这可以在编译时完成。

唯一的挑战是到达B::AFunc(),为此我们有虚拟表。但是一旦我们到达那里 - 没有问题,对象指针实际上指向一个B对象(它对 有效BSpecificFunc,并且函数调用BSpecificFunction已经解决。

于 2013-08-01T20:23:35.597 回答