对C++中的非纯虚拟类感到困惑,它们有什么用?

Vin*_*nce 1 c++ virtual hyperlink vtable

我有一个声明如下的类:

class TestFoo {
public:
    TestFoo();
    virtual void virtualFunction();
    void nonVirtualFunction();
};
Run Code Online (Sandbox Code Playgroud)

我尝试以这种方式实现

TestFoo::TestFoo(){}
void TestFoo::nonVirtualFunction(){}
Run Code Online (Sandbox Code Playgroud)

在编译时返回错误:

undefined reference to vtable for TestFoo
Run Code Online (Sandbox Code Playgroud)

我试过了 :

TestFoo::TestFoo(){}
void TestFoo::nonVirtualFunction(){}
void TestFoo::virtualFunction(){}
Run Code Online (Sandbox Code Playgroud)

编译确定与这些帖子的答案一致:

未定义的vtable参考

未定义的引用vtable

令我困惑的是,我认为声明虚函数的重点在于我不需要定义它.在这个例子中,我不打算创建任何TestFoo实例,而是创建从TestFoo继承的(具体)类的实例.但是,我仍然想为TestFoo的每个子类定义函数nonVirtualFunction.

我不对劲的东西?

谢谢 !

Ale*_*ain 7

声明虚函数的重点在于我不需要定义它

不完全是,它说"我可能想用派生类中的其他东西替换这个函数的实现."

我可能误解了你的问题,但你似乎暗示你不认为你可以在C++中定义纯虚拟成员函数,你可以.您可以按如下方式声明一个.

virtual void virtualFunction() = 0;
Run Code Online (Sandbox Code Playgroud)

通常,不会定义纯虚函数,但当然可以.这说"这个函数没有默认的实现,因为它并不总是有意义,但我会为你提供一个你可以选择的实现."

顺便说一句,如果一个类有任何虚函数,你还应该定义一个虚析构函数,因为它是完全合法的(并且经常被推荐)有一个指向派生类的基类(智能)指针 - 没有虚拟析构函数,对象可能不delete正确.