我得到一个指向基类的指针(实际上是指向某个派生类的指针)。然后我想在派生类上调用一个函数,但我不知道它是哪一个。
class Base
{
};
class DerivedOne : public Base
{
public:
void functionA()
{ int x = 0; }
};
class DerivedTwo : public Base
{
public:
void functionA()
{ int x = 0; }
};
int main()
{
Base* derivedTwoPtr = new DerivedTwo();
reinterpret_cast<DerivedOne*>(derivedTwoPtr)->functionA();
return 0;
}
这可以按照我的意愿运作,但我不得不说它看起来很狡猾。它是否定义了行为?如果没有,是否有合法的方法来动态解决这个问题?
答案 0 :(得分:7)
class Base
{
public:
virtual void functionA()=0;
};
class DerivedOne : public Base
{
public:
virtual void functionA()
{ int x = 0; }
};
class DerivedTwo : public Base
{
public:
virtual void functionA()
{ int x = 0; }
};
int main()
{
Base* derivedTwoPtr = new DerivedTwo();
derivedTwoPtr->functionA();
return 0;
}
答案 1 :(得分:3)
只需使用虚拟功能。这就是他们的目标。您的基类应该看起来像
class Base
{
virtual void functionA() = 0;
};
其中= 0
位是可选的。如果存在,则虚函数称为纯虚函数,并强制Base
的每个子类实现该函数。
现在,如果您通过functionA
指针调用Base
,您将获得适合指针指向的子类的方法。
答案 2 :(得分:1)
你基本上在这里回答了你自己的问题:
投放到一个班级并打电话 兄弟班的功能?
这是我想要的,但我必须这样做 说它看起来很狡猾。是吗 定义的行为?如果没有,是否有 合法的动态盟友解决了这个问题?
简而言之:
if (DerivedOne* one=dynamic_cast<DerivedOne*>(BasePtr))
one->functionA();
else if (DerivedTwo* two=dynamic_cast<DerivedTwo*>(BasePtr))
two->functionA();
但是,就像vava说的那样,不要这样做。
答案 3 :(得分:1)
是否有合法的动态方式 解决这个问题?
dynamic_cast
可用于强制转换为特定的派生类并调用派生类方法。但在您的情况下,最好的方法是在Base类中提供虚方法,并为派生类中的虚方法提供不同的实现。