我有以下课程:
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 ++编译器是否自动为继承的任何纯虚函数创建默认定义?
答案 0 :(得分:4)
调用纯虚函数(通过动态调度机制)是可以的。当你想到它时,这实际上是纯虚函数的目的。
我假设“从gkLogicController
对象上的另一个类调用”实际上意味着通过指针或对gkLogicController
的引用。然后,必须指向/引用从gkLogicController
派生的类的实例,该类实际覆盖clone
。 1}}本身的实例是不可能的,因为它仍然是抽象的。
答案 1 :(得分:2)
我猜你还没有编译你的代码。因为
struct A
{
virtual void test()=0;
};
struct B : A
{
};
int main()
{
B b;
}
看错误:
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
,你仍然可以这样做。
虚函数的重点是允许基类(或只知道基类的其他组件)调用派生类中的实际函数。