鍍金池/ 問(wèn)答/C++/ C++:當(dāng)前類的純虛函數(shù)是否可以在類外定義?

C++:當(dāng)前類的純虛函數(shù)是否可以在類外定義?

《C++ Primer》(第五版)第541頁(yè)中說(shuō):值得注意的是,我們也可以為純虛函數(shù)提供定義,不過(guò)函數(shù)體必須定義在類的外部。
但是當(dāng)我們做如下實(shí)驗(yàn)的時(shí)候卻會(huì)發(fā)生報(bào)錯(cuò):

#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;
}

錯(cuò)誤信息如下所示:

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; }
      ^

也就是說(shuō)對(duì)于聲明了純虛函數(shù)的class B本身來(lái)說(shuō)即使定義了純虛函數(shù)的函數(shù)體也是沒(méi)有意義的,但這顯然和書(shū)中所講不符,請(qǐng)問(wèn)這里面有什么問(wèn)題嗎?還是我的理解出現(xiàn)了問(wèn)題,謝謝大佬~

回答
編輯回答
你好胸

擁有純虛函數(shù)的類,是抽象類,不可以實(shí)例化對(duì)象;
純虛函數(shù)可以有函數(shù)體,對(duì)于使用的確是沒(méi)有意義,但是可以為子類實(shí)現(xiàn)這個(gè)純虛函數(shù)提供實(shí)現(xiàn)參考。

2018年6月3日 16:47
編輯回答
下墜

首先,擁有純虛函數(shù)的類,是一個(gè)抽象類,不可以實(shí)例化對(duì)象,所以 B b 的時(shí)候會(huì)報(bào)錯(cuò)。
1和3 報(bào)錯(cuò)就是這個(gè)原因。
第二個(gè)報(bào)錯(cuò)的話我覺(jué)得會(huì)不會(huì)是抽象類不能繼承,但是可以被繼承

2018年8月23日 22:45