在这段代码中,我将对象B的地址存储在A的指针类型对象中 如果我调用该函数,那么程序必须运行第二类函数但它不起作用并运行第一类函数 如果我在父类类函数之前放置虚拟,那么它将移向其他类函数 当我在指针类型对象中存储第二类地址时,程序必须显示第二类函数。但它无法做到这一点 为什么会这样?
#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();
}
答案 0 :(得分:1)
当我在指针类型对象中存储第二类地址时,程序必须显示第二类函数...
不,它没有。在C ++中,函数与类(类型)相关联,而不是与对象相关联。因此编译器会查看调用函数的指针类型。然后,它尝试在相应的类定义中找到这样的函数。
在你的情况下,编译器看到&#34;通过类型A&#34的指针调用函数fun()
;它只是将其翻译为fun()
的{{1}}地址。
*可调用函数存储在其他位置,但不存储在对象内部。
确实,这是&#34;静态类型&#34;语言:编译器通过对象类型的棱镜来查看对象。
但是,如上所述,如果要将函数与特定对象关联,则需要使用关键字class A
。这将为A类的每个对象创建一个虚拟表(并且所有对象都从A继承)。然后标记为virtual
的所有函数的地址将存储在此虚拟表中。因此,当继承类具有其自己的虚函数实现时,新实现的地址将virtual
对象的虚拟表中的先前地址。
现在,当您通过override
指针调用fun()
时,控制流(现在在运行时)将查找对象虚拟表,并找到您期望的函数的地址
class A
答案 1 :(得分:0)
您需要使用virtual
关键字,否则继承可能无法按预期工作。
请按以下方式更改class a
:
class a
{
public:
virtual void fun()
{
答案 2 :(得分:0)
在c ++中,指针是静态的。这意味着他们总是在寻找父母的功能,即使他们指向子类。你可以通过声明:有趣的虚拟来避免这种情况。看看这个: http://www.cplusplus.com/doc/tutorial/polymorphism/