2013-08-01 116 views
0

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

但是我的观点是:如果派生类中有一个非虚拟成员函数,将会在使用派生类覆盖虚拟基类成员函数时出现问题。

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

这是正确的吗?或者在使用基类指针作为跳转引用的函数中跳转时出现问题(如数组:函数的指针+ 2),是如何调用成员函数?

如果这是(不是我的意图,但仍然)没有问题,理论上可能有一个虚拟函数,需要一个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? 

} 

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

+0

它应该是很简单的编译这个小。测试程序,看看会发生什么! – krsteeve

+0

你不能像这样调用AFunc(),它是B的一部分,而不是一个独立的函数。 –

+0

编辑纠正谢谢'claptrap' – user2248685

回答

1

如果您致电pBaseClass->AFunc()pBaseClass实际上是B那么B::AFunc()是被调用的。如果pBaseClass实际上是A那么A::AFunc()就是所谓的。这就是多态的完整点。

B::AFunc()的作用是达到B,没有理由不能调用A中不存在的其他函数或B中的数据。

0

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

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

相关问题