Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++_Oop - Fatal编程技术网

C++ 抽象基类指针能否调用未被重写的派生类的函数?

C++ 抽象基类指针能否调用未被重写的派生类的函数?,c++,oop,C++,Oop,我试图使用抽象基类指针来调用未被重写的派生类函数,但我无法调用它。我们可以通过指向派生类对象的基类指针调用重写函数,那么为什么我们不能通过基类指针调用派生类的其他成员函数呢?当对对象调用方法时,编译器生成机器代码,以两种不同的方式之一调用该方法: 如果该方法不是虚拟的,则直接调用与指针类型相同的类的方法。此跳转是在编译时静态计算的。不考虑派生类的任何可能性 如果该方法是虚拟的,则调用该方法最派生的重写版本。这种跳转是通过运行时的动态调度来解决的,通常(但不是必需的)是通过使用虚拟方法表(vta

我试图使用抽象基类指针来调用未被重写的派生类函数,但我无法调用它。我们可以通过指向派生类对象的基类指针调用重写函数,那么为什么我们不能通过基类指针调用派生类的其他成员函数呢?

当对对象调用方法时,编译器生成机器代码,以两种不同的方式之一调用该方法:

  • 如果该方法不是虚拟的,则直接调用与指针类型相同的类的方法。此跳转是在编译时静态计算的。不考虑派生类的任何可能性
  • 如果该方法是
    虚拟的
    ,则调用该方法最派生的重写版本。这种跳转是通过运行时的动态调度来解决的,通常(但不是必需的)是通过使用虚拟方法表(vtables)来解决的,虚拟方法表(vtables)包含指向对象类层次结构中每个类中最重写的方法的指针
动态调度中只有
virtual
方法。仅当派生类方法在基类中为
virtual
且在派生类中被重写时,才可通过基类指针调用该派生类方法

否则,将直接调用基类方法。在这种情况下,调用派生类方法的唯一方法是将基类指针向下转换为正确的派生类类型,并通过生成的指针调用该方法

例如:

类基
{
公众:
虚拟~Base(){}
void非虚拟方法(){}
虚拟void virtualMethod(){}
};
派生类:公共基
{
公众:
void非虚拟方法(){}
void virtualMethod()重写{}
};
int main()
{
导出d;
基数*b=&d;
b->nonVirtualMethod();//调用Base::nonVirtualMethod()
static_cast(b)->nonVirtualMethod();//调用派生::nonVirtualMethod()
b->virtualMethod();//调用派生::virtualMethod()
}

请不要使用不相关的语言标记发送垃圾邮件。C与C++完全不同,并且没有类或基指针。请花些时间阅读,以及。最后,请你的问题改进一下(比如向我们展示你正在做的事情)。展示。因为这就是覆盖的意思。这意味着您可以通过基类指针调用派生类函数。如果有示例,请尝试。如果没有,就做一个。这是我的问题,为什么我们不能访问一个没有被基类指针覆盖的派生成员函数,即使我们已经为它分配了派生类对象地址的地址?@MussabMehboob你只是再次重复你原来的问题。因此,再问一次也没有意义。我的回答没有回答你的问题,那具体怎么办?