c++ - 将一种类型的对象分配给另一种类型

标签 c++ variable-assignment

下面的代码中有两个类。创建一个类型二的对象,然后将其分配给类型一的指针。

调用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/

相关文章:

c++ - Qt "no matching function for call"

c++ - 为什么编译超过100,000行的std::vector::push_back需要很长时间?

c++ - 我可以使用这种技术来防止违反抗锯齿规则吗?

java - 在 Java 中为链中的变量赋值

c++ - quickfix:如何将 FIX::Account 转换为 c_string 或其他类型

c++ - 从记事本进程内存中读取文本

Java 条件检查和赋值

jquery - 给jquery中的变量赋值

c++ - 容器的分配函数可能会溢出吗?

分配给 JS 对象的 Javascript Dom 元素 ID?我是疯了还是……?