运行时多态,对特定的派生类指针需要调用不一样的函数时

文章讨论了在C++中如何利用dynamic_cast进行类型检查,当传入特定子类对象时调用不同的函数。在函数myfun中,如果传入对象是Drive1的实例,则调用drivefun();否则,调用Base的fun()。此外,文章还提到了空指针调用成员函数的现象,虽然成员函数地址在编译时确定,但空指针调用时应避免使用this指针相关的成员变量。
摘要由CSDN通过智能技术生成

需求:当一个运行时多态的函数,当传入某个特殊的子类时,需要调用不同的函数。
解决方案:在函数中使用dyma_cast,如果成功转型就说明是此子类,否则转型为nullptr

class Base
{
public:
    virtual void fun()
    {
        cout << "Base::fun()" << endl;
    }
};

class Drive1 : public Base
{
public:
    void fun() override
    {
        cout << "Drive1::fun()" << endl;
    }

    void drivefun()
    {
        cout << "Drive1::drivefun()" << endl;
    }
};

class Drive2 : public Base
{
public:
    void fun() override
    {
        cout << "Drive2::fun()" << endl;
    }

    
};

void myfun(Base* p)
{

    Drive1* np = dynamic_cast<Drive1*>(p);
    if (np != nullptr)
    {
        np->drivefun();
        
    }
    else
    {
        p->fun();
    }

}

int main()
{
    Drive1 d1;
    Drive2 d2;
    
    myfun(&d1);
    myfun(&d2);

    Drive1* p = nullptr;
    p->drivefun();

	cout << "---------" << endl;

	return 0;
}

打印为
在这里插入图片描述
ps:
意外发现nullptr指针同样可以调用类的公有成员函数,因为成员函数的地址在编译时就已经确定,用空指针调用成员函数,只不过此时的this指针指向空而已,因此在函数中不能涉及this指针的调用,例如使用成员变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值