gpt4 book ai didi

c++ - 在运行时如何决定是调用派生类函数还是基类函数?

转载 作者:行者123 更新时间:2023-11-28 03:38:50 25 4
gpt4 key购买 nike

内部(在运行时)如何决定调用哪个函数,是基类函数还是派生类函数。在下面的示例代码中,如何决定调用 Bfn()Afn2() .

Class A { 
virtual void fn() { std::cout << "A" < <std::endl; }
virtual void fn2() { std::cout << "A-fn2" < <std::endl; }
};

Class B : A
{
void fn() { std::cout << "B" < <std::endl; }
}

int main() {
B b = new B;
A *a = &b;
a->fn();
a->fn2();
}

输出将是BA-fn2()

基本上,在运行时如何决定是调用派生类函数还是基类函数?

最佳答案

您所拥有的就是动态/运行时多态性
规则是:
在运行时调用的方法是在运行时选择的,取决于指针指向的实际对象。
编译器如何做到这一点完全取决于实现。通常,您的代码应该仅依赖于行为而不是其内部结构。然而,所有已知的编译器都是通过虚拟表(vtbl)和虚拟指针(vptr)机制来实现这个机制的。

运行时多态性是如何实现的?

一旦类具有虚拟 方法,该类就称为多态类,编译器会为该类创建一个vtblvtbl 存储该类中所有虚方法的地址。编译器还为该类的每个对象添加了一个特殊的指针 vptrvptr 指向(存储地址)到vtbl
一旦一个类派生自这样一个多态类,编译器就会用派生类中覆盖函数的地址替换派生类的vtbl中的方法地址。对于非覆盖方法,地址仍然是基类方法。

因此,每个类通常有一个vtbl,而每个对象实例都有一个vptr,它指向vtbl。每个类的vtbl 存储它自己 虚方法的地址。

在运行时,this 指针中的 vptr 被获取,并且 vtbl 中的适当方法地址被获取 & 然后它被称为,这种机制称为动态调度
因此,由于这种机制,可以根据指针指向的对象的类型 来确定要调用的适当方法。

这个 C++-Faq 是一个很好的进一步阅读:
<强> Inheritance — virtual functions

关于c++ - 在运行时如何决定是调用派生类函数还是基类函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9986555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com