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
的类型必须与它初始化时使用的值相同。并且
超类
需要一个虚拟析构函数,除非您计划在删除它之前将其从容器中取出并将其转换回
子类