需求:当一个运行时多态的函数,当传入某个特殊的子类时,需要调用不同的函数。
解决方案:在函数中使用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指针的调用,例如使用成员变量