gpt4 book ai didi

c++ - 当使用派生对象通过另一个基函数调用时,基函数和派生调用基函数中的公共(public)函数?

转载 作者:行者123 更新时间:2023-11-30 02:37:57 25 4
gpt4 key购买 nike

#include <iostream>

using namespace std;

class dissection {
int x;
public:
void test() {
cout<<"Test base";
}
void caller(){ test(); }
};

class dissectionDerived: public dissection {
int x;
public:
void test(){
cout<< "Test derived";
}
};

int main( int argc, char ** argv ) {
dissectionDerived derived;
derived.caller();
return 0;
}

在上面的代码示例中,输出是“测试基地”。我的想法是,由于派生没有名为 caller 的函数,它可以调用基类函数,但是由于对象的实际类型是 dissectionDerived 它将能够调用 dissectionDerived 类的测试函数。这是因为在基类范围内找到最接近的测试函数后重载决策停止了吗?

如果可以从派生函数调用调用者 函数,为什么它不能成为派生类重载决策的一部分?

我使用了 -cg g++ 编译器标志,然后对目标文件进行了 obj 转储,输出如下所示:

SYMBOL TABLE:

0000000000000000 l d .text._ZN10dissection4testEv 0000000000000000 .text._ZN10dissection4testEv
0000000000000000 l d .text._ZN10dissection6callerEv 0000000000000000 .text._ZN10dissection6callerEv
0000000000000000 w F .text._ZN10dissection4testEv 000000000000001d _ZN10dissection4testEv
0000000000000000 *UND* 0000000000000000 __gxx_personality_v0
0000000000000000 *UND* 0000000000000000 _ZSt4cout
0000000000000000 *UND* 0000000000000000 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
0000000000000000 w F .text._ZN10dissection6callerEv 000000000000001a _ZN10dissection6callerEv

c++filt _ZN10dissection4testEv 给出 dissection::test()

谢谢!

最佳答案

当您希望“涉及哪个实际类”来确定调用哪个函数时,需要将该函数标记为virtual。 .

这使得编译器将“虚函数表”作为该类和任何派生类的一部分。

换句话说,生成virtual void test();base . virtual属性将“继承”,因此您的派生类也将是 virtual - 为了“安全”你可以标记它override (例如 void test() override { ... } ,以确保在您尝试“覆盖”不属于基类的内容时编译器会给出错误。

关于c++ - 当使用派生对象通过另一个基函数调用时,基函数和派生调用基函数中的公共(public)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354232/

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