我理解为什么在将派生类分配给基类指针时只能调用基类函数的原理。从我对虚表的理解来看,原因是因为只有基类虚函数指针被放入虚表中,所以只能调用它们,但是如果基类指针指向派生类,当派生类构造函数被称为基类时类虚函数替换为虚表中的覆盖。
但是我的观点是:如果派生类中有一个非虚拟成员函数,该函数用于虚拟基类成员函数的派生类覆盖中,是否会有问题。
我的理论不应该存在,因为它的函数访问问题不在函数内跳转,通过将指针分配给新的 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?
}
目前处于设计阶段,这就是为什么我一直保持良好和理论化的原因。