Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 派生类特定函数,位于重写的虚拟函数内,由基类指针调用_C++_Class_Pointers_Polymorphism - Fatal编程技术网

C++ 派生类特定函数,位于重写的虚拟函数内,由基类指针调用

C++ 派生类特定函数,位于重写的虚拟函数内,由基类指针调用,c++,class,pointers,polymorphism,C++,Class,Pointers,Polymorphism,我理解为什么在将派生类分配给基类指针时只能调用基类函数的原理。根据我对虚拟表的理解,原因是只有基类虚拟函数指针被放入虚拟表中,因此只能调用它们,但是如果基类指针指向派生类,调用派生类构造函数时,基类虚拟函数将替换为虚拟表中的重写 然而,我的观点是:如果在虚拟基类成员函数的派生类重写中使用了派生类中的非虚拟成员函数,那么会出现问题吗 我的理论是不应该这样,因为这是函数访问的问题,而不是函数内部的跳跃,通过将指针分配给新的DerivedClass,就是为所有派生类分配空间,因此允许使用v表中保留的指

我理解为什么在将派生类分配给基类指针时只能调用基类函数的原理。根据我对虚拟表的理解,原因是只有基类虚拟函数指针被放入虚拟表中,因此只能调用它们,但是如果基类指针指向派生类,调用派生类构造函数时,基类虚拟函数将替换为虚拟表中的重写

然而,我的观点是:如果在虚拟基类成员函数的派生类重写中使用了派生类中的非虚拟成员函数,那么会出现问题吗

我的理论是不应该这样,因为这是函数访问的问题,而不是函数内部的跳跃,通过将指针分配给新的DerivedClass,就是为所有派生类分配空间,因此允许使用v表中保留的指向虚拟函数的指针访问虚拟重写函数。从那以后的所有动作都像是在一个派生类对象中,所以它可以跳转到它想要的任何函数

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

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

例如(无构造函数等的框架和声明/定义的分离)


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

如果您调用
pBaseClass->AFunc()
并且
pBaseClass
实际上是一个
B
,那么将调用
B::AFunc()
。如果
pBaseClass
实际上是一个
A
,那么将调用
A::AFunc()
。这就是多态性的全部要点


B::AFunc()
的作用取决于
B
,它没有理由不能调用
B
中不存在于
A

中的其他函数或使用
B
中的数据,这不应该有问题-对非虚拟函数的调用已经解决。可以这样想:
B::AFunc()
被编译成类似于
调用BSpecificFunc
的东西。这可以在编译时完成


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

编译这个小测试程序应该很简单,看看会发生什么!你不能调用AFunc()这样,它是B的一部分,而不是一个独立的函数。为更正而编辑,谢谢“claptrap”
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?

}