【问题标题】:Derived class specific functions, inside an overridden virtual function, being called by a base class pointer派生类特定函数,在重写的虚函数内,由基类指针调用
【发布时间】:2013-08-02 22:35:16
【问题描述】:

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

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

我的理论是不应该存在,因为它的函数访问问题不会在函数内跳转,通过将指针分配给新的 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?

}

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

【问题讨论】:

  • 编译这个小测试程序看看会发生什么应该很简单!
  • 你不能这样调用 AFunc(),它是 B 的一部分,而不是一个独立的函数。
  • 编辑更正感谢'claptrap'

标签: c++ class pointers polymorphism


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您调用pBaseClass->AFunc() 并且pBaseClass 实际上是B,那么B::AFunc() 就是被调用的对象。如果pBaseClass 实际上是A,那么A::AFunc() 就是被调用的对象。这就是多态性的全部意义所在。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 2017-04-07
      相关资源
      最近更新 更多