简单多态性

时间:2012-03-30 08:49:25

标签: c++ polymorphism

所以,显然我做错了什么......

#include <iostream>
using namespace std;

class thing1
{
public:
    void thingTest()
    {
        cout << "I AM THING 1\n";
    }
};

class thing2: public thing1
{
public:
    void thingTest()
    {
        cout << "I AM THING 2\n";
    }
};

void DoStuff( thing1 temp )
{
    temp.thingTest();
}


void main()
{
    DoStuff( thing2() );
}

我希望输出这段代码:

  

我是2岁

但我得到了:

  

我是1岁

这个项目的“最终”目标是创建一个类的LinkedList,以void WorkClass.Do(void)的形式存储任务。每个被吸入的类都是一个不同的任务(大多数与渲染与我的图形引擎的接口有关)。我想EnQueue构造函数,然后调用DoWork(),DeQueue WorkClass.Do(),直到我点击空指针。

我认为能够做到这一点简单的事情将是一个良好的开端,使所有其他的东西工作......但事实上,我已经碰到了一堵砖墙。我想我必须用指针做点什么......

3 个答案:

答案 0 :(得分:2)

你正在按价值取得它们,正在切割它们。您必须使用引用或指针(引用const或rvalue引用,在本例中为rvalues)

请注意使用virtual关键字。只有基类继承成员中的方法声明才需要它,virtual默认为virtual

ideone上的固定版本。

答案 1 :(得分:2)

virtual是你的朋友。

#include <iostream>
using namespace std;

class thing1
{
public:
    // Make this virtual, so that when called by pointer or 
    // by reference, the most derived version is called.
    virtual void thingTest()
    {
        cout << "I AM THING 1\n";
    }
};

class thing2: public thing1
{
public:
    // This is virtual by default, but it's best to be explicit,
    // especially when the next guy derives from thing2.
    virtual void thingTest()
    {
        cout << "I AM THING 2\n";
    }
};

// Pass by value to prevent object slicing
void DoStuff(thing1& temp )
{
    temp.thingTest();
}

// main always returns int
int main()
{
    thing2 x; // Create a thing2
    DoStuff(x); // Pass the rvalue
}

另见:

答案 2 :(得分:1)

您应该阅读有关C ++中多态的语法。

首先,在编译器为正确的运行时函数执行动态查找以在引用上调用之前,必须在基类中声明thingTest virtual EM>指针。在当前代码中,编译器已将编译时的函数修复为thing1::thingTest的函数,因为它未标记为虚拟。

其次,您将按值传递派生类到基类类型。这可能导致对象切片,即派生类的成员被切断。您需要通过引用或通过指向DoStuff

的指针传递对象