c++ - 派生类特定函数,在重写的虚函数内,由基类指针调用

标签 c++ class pointers polymorphism

我理解了派生类赋值给基类指针时为什么只能调用基类函数的原理。我对虚表的理解是因为只有基类虚函数指针被放入虚表所以只能调用它们但是如果基类指针指向派生类,当派生类构造函数被调用基类虚函数被替换为虚表中的重写。

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

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

这是正确的吗?或者使用基类指针作为跳转引用的函数中的跳转是否存在问题(如数组:*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?

}

目前处于设计阶段,这就是为什么我保留了这个漂亮的理论。

最佳答案

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

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

关于c++ - 派生类特定函数,在重写的虚函数内,由基类指针调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18003629/

相关文章:

c++ - 构造函数中的this指针

C++指针 vector <base_class*>放置派生类但切片打印

java - 尝试访问类时出现空指针异常

c++ - 删除对象时指向自动为空的指针

c - C 中指针的加法

c++ - 打印一个精度为 double 的值

c++ - 检测图像中的区域。 QT 中的重叠小部件可能吗?

c++ - 对 C/C++ 开发人员的人工支持

c++ - QListView 在 Mac OS 中不显示

javascript - 从现有对象动态创建新的 javascript 类