我理解为什么在将派生类分配给基类指针时只能调用基类函数的原理。根据我对虚拟表的理解,原因是因为只有基类虚函数指针被放入虚拟表中,因此只有它们可以被调用但是如果基类指针指向派生类,则在派生类构造函数被调用时class virtual function被替换为虚拟表中的override。
但是我的观点是:如果在派生类中有一个非虚拟成员函数,在虚拟基类成员函数的派生类重写中使用,则会出现问题。
我的理论是不应该的,因为函数访问的问题不是在函数内跳转,通过将指针分配给新的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 :(得分:1)
如果您致电pBaseClass->AFunc()
且pBaseClass
实际上是B
,那么B::AFunc()
就会被调用。如果pBaseClass
实际上是A
,那么A::AFunc()
就会被调用。这就是多态性的全部要点。
B::AFunc()
取决于B
的作用,没有理由不能调用其他函数或使用B
中A
中不存在的{{1}}中的数据。
答案 1 :(得分:0)
应该没有问题 - 对非虚拟功能的调用已经解决。可以这样想:B::AFunc()
被编译为类似call BSpecificFunc
的东西。这可以在编译时完成。
唯一的挑战是到达B::AFunc()
,为此我们有了虚拟表。但是一旦我们在那里 - 没有问题,对象指针实际指向B
对象(对BSpecificFunc
有效),对BSpecificFunction
的函数调用已经解决。