下面的代码中有两个类。创建一个类型二的对象,然后将其分配给类型一的指针。
调用out函数时,会调用类1的out函数。
#include<iostream>
using namespace std;
class one
{
public :
void out()
{
cout<<"one ";
}
};
class two
{
public :
void out()
{
cout<<"two ";
}
};
int main()
{
two dp[3];
one *bp = (one *)dp;
for (int i=0; i<3;i++)
(bp++)->out();
}
输出
one one one
根据我的说法,输出应该是两个而不是一个。 当我们创建类型二的对象时,该对象的内存位置包含了类二之外的函数的地址,那么为什么在赋值时会调用类一之外的函数呢?
编辑 - 而且,即使我们更改第二类中的函数名称,输出也不会改变。
最佳答案
新手假设所有 C++ 成员函数“属于”一个对象并不罕见。
正如您所注意到的,他们没有。
从概念上讲 - 精确的过程是编译器实现细节 - 您的 out
成员函数将转换为“自由”函数,如下所示:
void one_out(one* this) { cout << "one"; }
void two_out(two* this) { cout << "two"; }
对于非成员函数,这就是所需要的。
当编译器看到
(bp++)->out();
它知道 bp 是一个指向one
的指针(它不知道你撒谎了),所以它调用
one_out(bp++);
因为这就是编译器所做的。
关于c++ - 将一种类型的对象分配给另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11105417/