从基类调用未定义纯虚函数?

3

我有以下这个类:

class gkLogicBrick
{
public:
    gkLogicBrick(gkGameObject* object, gkLogicLink* link, const gkString& name);
    virtual ~gkLogicBrick();

    virtual gkLogicBrick* clone(gkLogicLink* link, gkGameObject* dest) = 0;

    //unimportant function/variables
};

并且它正在被子类化,例如:

class gkLogicController : public gkLogicBrick
{
    gkLogicController(gkGameObject* object, gkLogicLink* link, const gkString& name);
    virtual ~gkLogicController() {}

    //unimportant function/variables
};

名为clone()的方法没有被覆盖,但它从另一个类上调用了gkLogicController对象。我以为不允许调用纯虚函数?C++编译器是否会自动为任何继承的纯虚函数创建默认定义?


是的,它可以编译。这只是一个大型库的一小部分。我猜这不被允许,所以也许我应该进一步查看是否有其他我忽略的问题... - mpellegr
3个回答

4
通过动态分派机制调用纯虚函数是可以的。事实上,这正是纯虚函数的目的所在。
我认为“从另一个类中通过gkLogicController对象进行调用”实际上意味着通过指向gkLogicController的指针或引用进行调用。这必须指向/引用一个从gkLogicController派生且确实覆盖了clone的类的实例。无法创建gkLogicController本身的实例,因为它仍然是抽象的。

可能就是这样了。clone 函数被用于 gkLogicBrick 对象列表中的每个成员,我进一步追踪发现 gkLogicController 对象被添加到了这个列表中。现在我只需要看看是什么调用了这个函数,以此类推。 - mpellegr
经过大量的追踪,我似乎已经找到了实现克隆的对象所使用的类。谢谢! - mpellegr

2

我猜你还没有编译你的代码。因为

struct A
{
    virtual void test()=0;
};

struct B : A
{

};

int main()
{
    B b;    
}

http://ideone.com/Dbx9iH

查看错误信息:

prog.cpp: 在函数‘int main()’中: prog.cpp:13:7: error: 不能将变量‘b’声明为抽象类型‘B’ prog.cpp:6:8: note: 因为以下虚函数在‘B’类中是纯虚函数: prog.cpp:3:18: note: 虚函数 void A::test()


1

如果你没有在实际的类(例如派生类)中定义函数,你将在创建对象时(编译时)出现错误。

然而,如果基类从未直接实例化,则不必在基类中拥有函数 - 实际上,经常以此方式使用,只是为了确保在不应该使用时不会意外“使用”基类。如果基类旨在使用,则需要实现该函数(即使它的末尾说= 0)。

虚函数的整个目的是允许基类(或其他仅知道基类的组件)调用派生类中的实际函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接