C++:当前类的纯虚函数是否可以在类外定义?

《C++ Primer》(第五版)第541页中说:值得注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部
但是当我们做如下实验的时候却会发生报错:

#include <iostream>

class A {
public:
    virtual void printClassName() { std::cout << "This is class A" << std::endl; }
};

class B : public A {
public:
    void printClassName() = 0;
};

void B::printClassName() { std::cout << "This is class B" << std::endl; }

class C : public B {
public:
    void printClassName() override { std::cout << "This is class C" << std::endl; }
};

// void C::printClassName() 

int main(int argc, char const *argv[])
{
    A a;
    B b;
    C c;
    a.printClassName();
    b.printClassName();
    c.printClassName();
    return 0;
}

错误信息如下所示:

a.cpp: In function 'int main(int, const char**)':
a.cpp:25:7: error: cannot declare variable 'b' to be of abstract type 'B'
     B b;
       ^
a.cpp:8:7: note:   because the following virtual functions are pure within 'B':
 class B : public A {
       ^
a.cpp:13:6: note:       'virtual void B::printClassName()'
 void B::printClassName() { std::cout << "This is class B" << std::endl; }
      ^

也就是说对于声明了纯虚函数的class B本身来说即使定义了纯虚函数的函数体也是没有意义的,但这显然和书中所讲不符,请问这里面有什么问题吗?还是我的理解出现了问题,谢谢大佬~

阅读 5.6k
2 个回答

首先,拥有纯虚函数的类,是一个抽象类,不可以实例化对象,所以 B b 的时候会报错。
1和3 报错就是这个原因。
第二个报错的话我觉得会不会是抽象类不能继承,但是可以被继承

拥有纯虚函数的类,是抽象类,不可以实例化对象;
纯虚函数可以有函数体,对于使用的确是没有意义,但是可以为子类实现这个纯虚函数提供实现参考。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题