从没有定义它的基类调用纯虚函数?

时间:2013-07-05 20:24:15

标签: c++ oop inheritance pure-virtual

我有以下课程:

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

3 个答案:

答案 0 :(得分:4)

调用纯虚函数(通过动态调度机制)是可以的。当你想到它时,这实际上是纯虚函数的目的。

我假设“从gkLogicController对象上的另一个类调用”实际上意味着通过指针或对gkLogicController的引用。然后,必须指向/引用从gkLogicController派生的类的实例,该类实际覆盖clone

答案 1 :(得分: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:注意:虚拟空虚A :: test()

答案 2 :(得分:1)

如果未在实际类(例如派生类)中定义函数SOMEWHERE,则在尝试创建对象时(编译时)将出现错误。

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

虚函数的重点是允许基类(或只知道基类的其他组件)调用派生类中的实际函数。