【问题标题】:Calling a pure virtual function from base class that doesn't define it?从未定义的基类调用纯虚函数?
【发布时间】:2013-07-03 23:58:51
【问题描述】:

我有以下课程:

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

【问题讨论】:

  • 是的,它可以编译。它只是大型图书馆的一小部分。我猜那是不允许的,所以也许我应该进一步看看,看看是否还有其他我想念的事情发生......

标签: c++ oop inheritance pure-virtual


【解决方案1】:

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

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()

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这可能是它。为gkLogicBrick 对象列表中的每个成员调用clone 函数,我进一步跟踪发现gkLogicController 对象已添加到此列表中。现在我只需要看看是什么调用了那个函数,等等。
      • 经过多次跟踪,我似乎找到了正在使用的实现克隆的对象类。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      相关资源
      最近更新 更多