gpt4 book ai didi

c++ - 将指向基础对象的指针转换为派生类的指针

转载 作者:行者123 更新时间:2023-12-02 09:57:38 26 4
gpt4 key购买 nike

通过将基类对象的指针转换为派生类的指针,我一直感到困惑。
请检查以下代码:

derivate_class *d1 = (derivate_class*)cb;
d1->print();
d1->print1();

结果是:
  • 我是基本的虚函数。
  • 我是派生类中的函数。

  • 谁能帮我解释为什么 d1->print()打印“我是基本的虚拟函数”?
    #include <iostream>
    using namespace std;

    class base
    {
    public:
    virtual void print()
    {
    cout << "I'm a virtual function in base." << endl;
    }
    };

    class derivate_class : public base
    {
    public:
    void print()
    {
    cout << "I rewrite the virtual function in base." << endl;
    }

    void print1()
    {
    cout << "I'm a function in derivate class." << endl;
    }
    };

    int main()
    {
    base* b = new base();
    derivate_class *d = new derivate_class();
    b->print();
    d->print1();
    base* cb = b;
    b = d;
    b->print();
    cout << "*********************" << endl;

    derivate_class *d1 = (derivate_class*)cb;
    d1->print();
    d1->print1();

    system("pause");
    return 0;
    }

    最佳答案

    它是UB,所以任何事情都可能发生。

    但这是一种解释:d1实际上并不指向derivate_class,而是指向base

    base* b = new base();
    //...
    base* cb = b;
    derivate_class *d1 = (derivate_class*)cb;
    d1->print();
    d1->print1();

    该调用是动态的,因为它是通过指针进行的,并且方法是 virtual
    print1不是 virtual,因此该调用会静态解决。 printvirtual,因此调用了派生类型最多的实现。但是在这种情况下,最派生的类型实际上是 base

    在后台,在 print中的vfptr指向的虚拟功能表中寻找 cb方法。由于 cvbase,因此该表将是 base的表,该表包含具有 print实现的函数 base::print。这就是为什么要调用该函数的原因。

    关于c++ - 将指向基础对象的指针转换为派生类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484561/

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