gpt4 book ai didi

c++ - 继承中的指针类型对象

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

在这段代码中,我将对象 B 的地址存储在 A 的指针类型对象中。
如果我调用该函数,则程序必须运行第二类函数,但它不起作用并运行第一类函数。
如果我将 virtual 放在父类函数之前,那么它会转向其他类函数。
当我在指针类型对象中存储二级地址时,程序必须显示二级函数。但它不能这样做。
为什么会这样?

#include<iostream>

using namespace std;
#include<conio.h>

class a
{
public:
void fun()
{
cout << "1st";
}
};

class b:public a
{
public:
void fun()
{
cout << "2nd";
}
};

class c :public a
{
public:
void fun()
{
cout << "3rd";
}
};

void main()
{
a *A;
b B;
c C;
A = &B;
A->fun();
_getch();
}

最佳答案

When i stored 2nd class address in pointer type object, program have to show 2nd class function...

不是,不是。在 C++ 中,函数与类(类型)而不是对象相关联。因此,编译器会查看调用函数的指针类型。然后,它试图在相应的类定义中找到这样的函数。在您的情况下,编译器看到“通过类型 A 的指针调用函数 fun()”,它只是将其从 转换为 fun() 的地址A 类

*可调用函数存储在别处,但不在对象内部。

的确,这就是“静态类型”语言的要点:编译器通过对象类型的棱镜来查看您的对象。

但是,如前所述,如果您想将函数与特定对象关联起来,则需要使用关键字virtual。这将为 A 类的每个对象(以及所有从 A 继承的对象)创建一个虚拟表。然后所有标记为 virtual 的函数的地址将存储在这个虚拟表中。因此,当继承类有自己的虚函数实现时,新实现的地址将覆盖对象虚表中的先前地址。

现在,当您通过 class A 的指针调用 fun() 时,控制流(现在在运行时)将查找对象虚拟表并将找到您期望的函数的地址。

class A
{
public:
virtual void fun()
{
cout << "1st";
}
};
class B
{
public:
void func() override
{
cout << "2nd";
}
}
void main()
{
a *A;
b B;
A = &B;
A->fun(); // -> "2nd"
// function address deduced at runtime
}

关于c++ - 继承中的指针类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45581408/

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