C++;多态性,函数调用 好吧,作为程序员我很缺乏经验,更不用说C++了,所以我来这里。我想做的是让容器类保存父类指针,然后使用多态性存储子类对象。问题是我想通过父类指针调用子类的函数之一。下面是我在代码中的意思的一个示例: class SuperClass { public: int x; } class SubClass : public SuperClass { public: void function1() { x += 1; } } class Container { public: SuperClass * alpha; Container(SuperClass& beta) { alpha = beta; } } int main() { Container cont = new Container(new SubClass); }
(我不确定这是不是对的,我在指针方面仍然很不稳定。我希望这至少能让人明白这一点。)C++;多态性,函数调用 好吧,作为程序员我很缺乏经验,更不用说C++了,所以我来这里。我想做的是让容器类保存父类指针,然后使用多态性存储子类对象。问题是我想通过父类指针调用子类的函数之一。下面是我在代码中的意思的一个示例: class SuperClass { public: int x; } class SubClass : public SuperClass { public: void function1() { x += 1; } } class Container { public: SuperClass * alpha; Container(SuperClass& beta) { alpha = beta; } } int main() { Container cont = new Container(new SubClass); },c++,polymorphism,containers,C++,Polymorphism,Containers,(我不确定这是不是对的,我在指针方面仍然很不稳定。我希望这至少能让人明白这一点。) 所以,我不能完全确定我是否能做到这一点。我暗自怀疑答案是否定的,但我想确定。如果有人有其他方法来完成这类事情,我很乐意听到。绝对可能。只需对代码进行一些小的更改,就可以实现这一点。 您需要将基类(超类)更改为具有与派生类(子类)具有相同“签名”的虚拟方法。您还需要更改容器构造函数以获取指向超类的指针,而不是引用。我认为,这是所有必要的,以使这项工作 编辑:尝试在评论中包含建议。好的观点。希望我没有把事情搞得太糟
所以,我不能完全确定我是否能做到这一点。我暗自怀疑答案是否定的,但我想确定。如果有人有其他方法来完成这类事情,我很乐意听到。绝对可能。只需对代码进行一些小的更改,就可以实现这一点。 您需要将基类(超类)更改为具有与派生类(子类)具有相同“签名”的虚拟方法。您还需要更改容器构造函数以获取指向超类的指针,而不是引用。我认为,这是所有必要的,以使这项工作 编辑:尝试在评论中包含建议。好的观点。希望我没有把事情搞得太糟
class SuperClass
{
public:
int x;
// virtual destructor ensures that the destructors of derived classes are also
// invoked
virtual ~SuperClass() { }
// abstract virtual method to be overriden by derived classes
virtual void function1() = 0;
}
class SubClass : public SuperClass
{
public:
~SubClass()
{
}
void function1()
{
x += 1;
}
}
class Container
{
public:
SuperClass * alpha;
Container(SuperClass* beta)
{
alpha = beta;
}
~Container()
{
// Note, this will invoke the destructor of the SubClass class because
// SuperClass's destructor is marked as virtual.
delete alpha;
}
}
int main()
{
Container* cont = new Container(new SubClass());
delete cont;
}
你必须改变路线:
Container(SuperClass& beta)
到
容器(超类*beta版)
哎呀,我忘了虚拟的 对孩子函数的调用在哪里?(您的意思是将function1()放在某个地方吗?)多态性意味着从派生类中重写的基类调用函数。调用仅在派生类中定义的函数会显示设计问题。您可能希望在这种情况下强制转换。@stefaanv这些需要强制转换的“设计问题”表明应该找到强制转换以外的解决方案!:)我想指出的是,如果function1只由子类定义,那么您可能希望将其声明
virtualvoidfunction1()=0代码>这使超类变得抽象,并要求它在子类中实现,从而强制多态性。还请注意,该示例泄漏了一个子类和一个容器。如果它一直持续到程序结束,则实际上不是泄漏,但应该有一个容器
析构函数,如~Container(){delete alpha;}
。当然,假设容器
拥有它指向的超类
或子类
,那么main()
中的声明需要是Container*cont=newcontainer(new SubClass)代码>或容器cont(新子类)代码>。cont
的类型必须与它初始化时使用的值相同。并且超类
需要一个虚拟析构函数,除非您计划在删除它之前将其从容器中取出并将其转换回子类
。