我在下面的代码中遇到致命的链接错误,它说:
]+0x10)||undefined reference to `base<node>::pass_derived(node)'|
我想定义一个base
类,它有一个名为poly_type
的指针,base
类也可以从另一个名为derived
的类中“访问”。我遇到的问题是行poly_type->pass_derived(n);
,其中编译器不希望看到我尝试传递类型node
的对象的派生类。我猜这是C ++的限制,如果是这样,请告诉我。这是破碎的代码,
编辑似乎已经在其他地方询问了这一点,我更新了源代码以反映该意见。
答案 0 :(得分:1)
基类中没有pass_derived的定义。 您将其声明为虚函数,但仅在派生类中定义它。 因为它在main函数中实例化了base,所以编译器会尝试为base生成代码,但是找不到pass_derived的定义。
您可以添加默认实现 - 即使它只是空的。
至于你是否最终可以调用derived :: pass_derived而不是...... :)祝你好运,它看起来很有趣。您正在构建自己的继承版本?
答案 1 :(得分:1)
问题在于:
template < class T>
class base
{
// ...
virtual void pass_derived(T data);
};
您将pass_derived
声明为virtual
但不是纯virtual
。因此,如果您不提供实现,链接器会引发错误。
要么提供实现,要么(我认为是您的意图)将其声明为virtual
:
virtual void pass_derived(T data) = 0;
但是你无法实例化base<T>
并且只能使用指向base
的指针或引用(实际指向/引用derived
)。