C ++大师。我正在尝试在C ++中实现多态。我想编写一个具有虚函数的基类,然后在子类中重新定义该函数。然后在我的驱动程序中演示动态绑定。但是我只是无法正常工作。我知道如何在C#中执行此操作,因此我发现在C ++代码中使用C#语法的地方可能犯了一些语法错误,但这些错误对我来说一点都不明显。因此,如果您能纠正我的错误,我将不胜感激。#ifndef POLYTEST_H#define POLYTEST_Hclass polyTest{ public: polyTest(); virtual void type(); virtual ~polyTest();};#endif#include "polyTest.h"#include <iostream>using namespace std;void polyTest::type(){ cout << "first gen";}#ifndef POLYCHILD_H#define POLYCHILD_H#include "polyTest.h"using namespace std;class polyChild: public polyTest{ public: void type();};#endif#include "polyChild.h"#include <iostream>void polyChild::type(){ cout << "second gen";}#include <iostream>#include "polyChild.h"#include "polyTest.h"int main(){ polyTest * ptr1; polyTest * ptr2; ptr1 = new polyTest(); ptr2 = new polyChild(); ptr1 -> type(); ptr2 -> type(); return 0;}我意识到我没有实现构造函数或析构函数,因为这只是一个测试类,它们不必执行任何操作,并且编译器将提供默认的构造函数/析构函数。那就是为什么我遇到编译错误?为什么会这样呢? 最佳答案 juanchopanza为您提供了正确的答案:您可以将子类型的指针分配给父类型的指针,因为子类也是父类的类型。派生对象是基类对象(作为其子类),因此可以由基类指针指向。但是,基类对象不是派生类对象,因此无法分配给派生类指针。我用一个比喻:狗是动物,猫是动物。您不能说动物永远是猫或狗。在C ++中,运行时类型检查是通过dynamic_cast实现的,这使您可以检查父类是否具有某种类型的子类(以此类推,这使您可以检查Animal是否是Cat)。编译时向下转换是由static_cast实现的,但是此操作不执行类型检查。如果使用不当,可能会产生不确定的行为。通常,向下转换的滥用表明接口的设计不良,除非您要实现双调度模式之类的东西,否则您不必在程序中一直都使用向下转换。另一方面,请大写您的类,对于大多数(如果不是全部)C ++约定,这是相当标准的。我在您的程序中修复了所有其他内容,并且应该对其进行编译。#include <iostream>using namespace std;class PolyTest{ public: virtual ~PolyTest() {} // your example had no body virtual void type();};void PolyTest::type(){ cout << "first gen";}class PolyChild: public PolyTest{public: void PolyChild::type();};void PolyChild::type(){ cout << "second gen";}int main(){ PolyTest* ptr1 = new PolyTest(); PolyTest* ptr2 = new PolyChild(); ptr1->type(); ptr2->type(); cout << std::endl; PolyChild* pChild1 = dynamic_cast<PolyChild*>(ptr1); if (pChild1) cout << "ptr1 is a PolyChild" << std::endl; else cout << "ptr1 is NOT a PolyChild" << std::endl; PolyChild* pChild2 = dynamic_cast<PolyChild*>(ptr2); if (pChild2) cout << "ptr2 is a PolyChild" << std::endl; else cout << "ptr2 is NOT a PolyChild" << std::endl; cin.ignore(1); return 0;}我还添加了一些代码来演示dynamic_cast 。同样,您不应滥用它,这意味着您没有正确设计接口。
10-06 10:49