C++ C++;从基类调用派生类函数
我不知道如何从基类调用派生类函数而不产生某种错误,下面是我尝试使用的代码的框架C++ C++;从基类调用派生类函数,c++,derived-class,C++,Derived Class,我不知道如何从基类调用派生类函数而不产生某种错误,下面是我尝试使用的代码的框架 class DiceGame{ public: virtual void play(){ // Trying to call the derived class // Knockout's play function in here // I've been trying this DiceGame *game = new Knockout;
class DiceGame{
public:
virtual void play(){
// Trying to call the derived class
// Knockout's play function in here
// I've been trying this
DiceGame *game = new Knockout;
game->play();
// But it gives me a memory error
}
class Knockout : public DiceGame{
void play(){
// This has the stuff I want to call
}
main(){
DiceGame *game = new DiceGame();
game->play();
}
我已经尝试了敲除类的前向声明,但这也给了我一个不完整的前向声明错误,有什么建议吗?一般来说,基类不应该知道它的派生类。我的建议是使
虚拟void play_internal()
并派生它,您可以在play()内部调用它
(这将不再是虚拟的)@Borgleader与这个问题无关,但纯粹是好奇:在那种情况下,基类现在应该是关于它的派生类的吗?听起来你可以使用你试图从虚拟成员函数调用的,在新的本地动态分配的特定于实例的派生类型上,该函数的重写实现。这对我来说是非常可疑的,可能不是你问题的解决方案。一般来说,基类不应该知道它的派生类。我的建议是让虚拟void play\u internal()
并派生它,你可以在play()
内部调用它(不再是虚拟的)@Borgleader与这个问题无关,但纯粹出于好奇:在何种情况下,基类现在应该与其派生类相关?听起来您可以使用一个虚拟成员函数,在新的本地动态分配的实例特定派生类型上调用同一函数的重写实现。这对我来说都是非常可疑的,可能不是您问题的解决方案。我建议改进一点:在Knockout
子类中,使用override
说明符,而不是virtual
。这个功能从C++11开始就可以使用。@CraigYoung,你说得对,但我故意没有使用override
,因为这是一个初学者的问题。我相信教override
对初学者来说更好:1)说明符名称更符合多态性概念。2) 它避免了由于签名稍有不同而不调用覆盖的小错误情况。@Craigyong,我已经添加了关于“覆盖”的注释。我建议一个改进:在敲除
子类中,使用覆盖
说明符,而不是虚拟
。这个功能从C++11开始就可以使用。@CraigYoung,你说得对,但我故意没有使用override
,因为这是一个初学者的问题。我相信教override
对初学者来说更好:1)说明符名称更符合多态性概念。2) 它避免了由于签名稍有不同而不调用覆盖的小错误情况。@Craigyong,我已经添加了关于“覆盖”的注释。
class DiceGame{
public:
virtual void play() = 0;
};
class Knockout : public DiceGame{
public:
virtual void play() { // Replace "virtual" with "override" here if your compiler supports "override" keyword.
// This has the stuff I want to call
}
};
int main()
{
DiceGame *game = new Knockout();
game->play();
return 0;
}