C++多态,函数调用

moa*_*oai 3 c++ polymorphism containers

好吧,作为一名程序员,我很缺乏经验,更不用说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);
}
Run Code Online (Sandbox Code Playgroud)

(我不确定那是对的,我仍然对指针感到不稳定.我希望至少可以解决这个问题.)

所以,我不完全确定我是否可以这样做.我有一个潜在的怀疑,答案是否定的,但我想确定.如果有人有另一种方法来完成这种事情,我会很高兴听到它.

And*_*son 6

绝对有可能.只需对代码进行一些小的更改就可以实现这一点.您需要更改基类(SuperClass)以使虚拟方法具有与派生类(SubClass)相同的"签名".您还需要更改Container构造函数以获取指向SuperClass而不是引用的指针.我认为应该有必要让这一切发挥作用.

编辑:尝试在评论中包含建议.好点.希望我没有把它弄得太糟糕!

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 并且`SuperClass`需要一个虚拟析构函数,除非你打算将它从容器中取出并在删除之前将其强制转换回`SubClass`. (3认同)
  • 我想指出,如果function1只是由子类定义,你可能想要声明`virtual void function1()= 0;`这使得SuperClass抽象并要求它在子类中实现,强制执行多态性. (2认同)