本文討論的前提是在C++標(biāo)準(zhǔn)下的類和結(jié)構(gòu)體,而不是討論C中的結(jié)構(gòu)體.
在C++中,類和結(jié)構(gòu)體的唯一區(qū)別是成員的可見(jiàn)性(兩者都支持?jǐn)?shù)據(jù)和成員函數(shù)以及構(gòu)造函數(shù)和析構(gòu)函數(shù)).
對(duì)于類來(lái)說(shuō),成員默認(rèn)為私有.
對(duì)于結(jié)構(gòu)體來(lái)說(shuō),成員默認(rèn)為公有.
對(duì)于繼承來(lái)說(shuō),類之間的繼承,成員默認(rèn)為私有,而結(jié)構(gòu)體之間的繼承則默認(rèn)為公有.
如果是類和結(jié)構(gòu)體之間的繼承,情況會(huì)怎樣呢?
class A
{
public:
int a;
};
struct B : A { };
struct C
{
int c;
};
class D : C
{
};
int main()
{
B b;
D d;
b.a = 1;
d.c = 2;
}
用 C++編譯器編譯上面的代碼,會(huì)在 d.c = 2;處報(bào)錯(cuò),VC 6.0給出的錯(cuò)誤提示:error C2248: ‘c’ : cannot access public member declared in class ‘C’,看起來(lái)有點(diǎn)匪夷所思啊,不能訪問(wèn)公有成員(既然都公有了,還不能訪問(wèn)?).
相應(yīng)的C++標(biāo)準(zhǔn) 11.2.2 of ISO/IEC 14882-2003文檔:
the kind of inheritance is determined by the derived class being declared as a class or struct when an access specificer for the base class is absent.
當(dāng)被繼承的基類缺少存取說(shuō)明符的修飾時(shí), 繼承的類型由被聲明為類或者結(jié)構(gòu)體的派生類所決定.
示例中class D : C, 基類C并沒(méi)有存取說(shuō)明符的修飾,那么集成的類型就由派生類D來(lái)決定,D被聲明為類(而非結(jié)構(gòu)體),對(duì)于類來(lái)說(shuō),類之間的繼承,成員默認(rèn)為私有,所以實(shí)際上此時(shí)的int c;應(yīng)該為私有,那么上面的編譯錯(cuò)誤也就可以解釋通了.
我們可以試著把class D : C 改為 class D : public C,就可以編譯通過(guò)了.