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++ 编译器是否会自动为任何继承的纯虚函数创建默认定义?

4

3 回答 3

4

调用纯虚函数就可以了(通过动态调度机制)。仔细想想,这实际上就是纯虚函数的目的。

我假设“从gkLogicController对象上的另一个类调用”实际上意味着通过指针或对gkLogicController. 然后,这必须指向/引用从其派生的类的实例gkLogicControlleroverride clone。创建自身的实例是不可能的gkLogicController,因为它仍然是抽象的。

于 2013-07-05T20:29:45.233 回答
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:错误:无法将变量'b'声明为抽象类型'B' prog.cpp:6:8:注意:因为以下虚函数在“B”中是纯函数:prog.cpp:3:18:注意:virtual void A::test()

于 2013-07-05T20:27:50.607 回答
1

如果您没有在实际类(例如派生类)中定义函数 SOMEWHERE,则在尝试创建对象时(在编译时)会出错。

但是,如果从不直接实例化基类,则在基类中没有一个也很好 - 事实上,它经常以这种方式使用,只是为了确保基类不会在不应该被意外“使用”时被“使用”。如果打算使用基类,那么您确实需要实现该功能(即使它= 0最后说,您仍然可以这样做。

虚函数的全部意义在于允许基类(或其他只知道基类的组件)调用派生类中的实际函数。

于 2013-07-05T20:29:33.583 回答