2010-03-23 48 views
3

好吧,我作为一个程序员很缺乏经验,更不用说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); 
} 

(我不知道这是正确的,我还真是不稳固的三分球,我希望它横跨得到的地步,至少。)

所以,我不完全确定我是否可以做到这一点。我有一个偷偷摸摸的怀疑,答案是否定的,但我想确定。如果有人有另一种方法来完成这种事情,我很乐意听到它。

+0

呼叫孩子的功能在哪里? (你是否想把function1()放在某处?) – 2010-03-23 17:27:15

+0

多态意味着从派生类中覆盖的基类中调用一个函数。仅在派生类中定义的调用函数显示设计问题。你可能想在这种情况下投。 – stefaanv 2010-03-23 19:09:32

+0

@stefaanv这些需要演员阵容的“设计问题”表明应该找到演员以外的解决方案! :) – 2010-04-06 01:34:35

回答

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; 
} 
+2

我想指出的是,如果function1只是由子类定义的,你可能想要声明为'virtual void function1()= 0;'这使得SuperClass抽象并且要求它被实现在子类,强制多态。 – Matt 2010-03-23 17:30:42

+0

另请注意,该示例泄漏了一个子类和一个容器。 – Fozi 2010-03-23 17:33:36

+0

它不是真的泄漏,如果它持续到程序结束,但应该有一个'容器'析构函数像'〜Container(){delete alpha; }'。当然,假设'Container'拥有它指向的'SuperClass'或'SubClass'。 – 2010-03-23 17:39:20

0

你得改线:

Container(SuperClass& beta) 

Container(SuperClass* beta)

哎呀,我忘了虚拟的。