所以,显然我做错了什么......
#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(),直到我点击空指针。
我认为能够做到这一点简单的事情将是一个良好的开端,使所有其他的东西工作......但事实上,我已经碰到了一堵砖墙。我想我必须用指针做点什么......
答案 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 ++中多态的语法。
首先,在编译器为正确的运行时函数执行动态查找以在引用上调用1>之前,必须在基类中声明thingTest
virtual
EM>指针。在当前代码中,编译器已将编译时的函数修复为thing1::thingTest
的函数,因为它未标记为虚拟。
其次,您将按值传递派生类到基类类型。这可能导致对象切片,即派生类的成员被切断。您需要通过引用或通过指向DoStuff
。