拷贝父类对象,父类对象调用子类实现的方法

本文介绍了如何在不确定对象具体类型的情况下,通过父类指针调用其实现的方法,特别适用于动态加载和泛型场景。通过BaseFoo类及其派生类foo和fooo的实例,展示了如何使用setChild方法传递子类对象并执行invoke方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时会有这样的需求,需要拷贝一个对象时,不知道对象的确切类型,只知道他的父类类型。

如果只希望获得未知对象对父类方法的实现,可以在构造对象的时候把对象的指针传给父类对象。

应用在一些动态、泛型的场合,比如动态加载了一个DLL,里面子类的类型是不知道的,但是知道他实现了父类的方法,就可以调用它。

代码:

#include <iostream>
class BaseFoo {
public:
    BaseFoo* childfoo = nullptr;
    void setChild(BaseFoo* foo) {
        //获得了子类实现的 invoke 方法,但子类其他的数据在黑箱中
        childfoo = foo;
    }
    virtual int invoke() { 
        childfoo->invoke();
        return 0;
    }
};

class foo:public BaseFoo {
public:
    foo() {
        setChild(this);
    }
    int invoke() {
        std::cout << "I am the foo\n";
        return 0;
    }
};

class fooo :public BaseFoo {
public:
    fooo() {
        setChild(this);
    }
    int invoke() {
        std::cout << "I am the foooooooooooo\n";
        return 0;
    }
};

int main()
{
    foo f;
    BaseFoo*f2 = new BaseFoo(f);
    f2->invoke();

    fooo fo;
    BaseFoo* fo2 = new BaseFoo(fo);
    fo2->invoke();

    std::cout << "Hello World!\n";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值