派生的类指针使用static_cast指向基类对象

Derived Class Pointer Pointing To Base Class Object Using Static_Cast

本文关键字:cast 基类 对象 static 指针 派生      更新时间:2023-10-16

i具有以下代码,其中我具有基类和派生类。基类和派生类都有一个函数成员共享相同名称。在Main()中,我已将基类对象输入到派生的类指针中,并试图调用该函数。令我惊讶的是,它称为派生的类功能成员。据我所知,基类对象不会有有关派生类对象的任何信息。那么,我的派生类指针如何仍然能够访问派生的成员函数?

在升级的情况下,我确实知道派生的类对象将具有基类的内容,这就是为什么指向派生类对象的基类指针会按预期工作。

有人可以帮助我理解即使我有一个指向基类对象的派生类指针(没有派生类信息)的派生类成员函数即使是如何调用的?

#include<iostream>
using namespace std;

class base
{
public:
     void b()
    {
        cout << "base";
    }
};
class derived:public base
{
public:
    void b()
    {
        cout << "derived";
    }
};
int main()
{
    base b;
    derived * d1;
    d1 =static_cast<derived*>(&b);
    d1->b();        
    return 0;
}

在您的特定情况下,B被称为B>。

您有一个指向派生类的指针,b不是虚拟的。因此,编译器将生成派生的调用:: B方法。

现在,当您将b放在该指针中时,它是未定义的行为。但是就您而言,由于您不访问该指针,所以没有问题。

将基类施放到派生的类结果不确定的行为

,据我所知,该函数在内存中没有任何额外的空间,它像普通函数一样存储。您可以将成员函数视为正常函数,并具有额外的指针。通常,要调用的函数由对象指针的类型确定。但是虚拟函数是不同的,它通过虚拟函数表称为代码中,没有声明虚拟函数。因此没有虚拟功能表。

您可以以不同的方式看到您的代码:

void derived_b(derived* this)
{
    cout << "derived";
}
void base_b(base* this)
{
    cout << "base";
}
int main()
{
    base b;
    derived * d1;
    d1 =static_cast<derived*>(&b);
    derived_b(d1);        
    return 0;
}

如果您在课堂中定义了某些成员并将其在函数B中使用,则可能会导致一些错误。例如

class base
{
public:
    void b()
    {
        cout << "base";
    }
};
class derived:public base
{
    int a;
public:
    derived(){a = 1;}
    void b()
    {
        cout << "derived" << a;
    }
};

您在main()中的代码可能会导致错误,因为对象B在内存中没有任何成员。