8章 継承

http://www.geocities.jp/ky_webid/cpp/language/008.html

なかなかややこしい話ですが、これはあるクラスのメンバ変数や関数を全て引き継いだ新しいクラスを定義できるということでしょうか。

とにかくやってみましょう。実際に動かしてみるのが一番早いです。

#include <iostream>

class CBase {
public:
    void PrintNum();
private:
    int m_num;
};

void CBase::PrintNum() {
    std::cout << m_num << std::endl;
}

class CSub : public CBase {
public:
    void SetNum(int);
};

void CSub::SetNum(int num) {
    m_num = num;
}

int main () {
    CSub obj;
    obj.SetNum(100);
    obj.PrintNum();
    return 0;
}

これをコンパイルするとエラーになりました・・。

$ cl /W4 /EHs main.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(20) : error C2248: 'CBase::m_num' : private メンバ (クラス 'CBase' で宣
言されている) にアクセスできません。
        main.cpp(7) : 'CBase::m_num' の宣言を確認してください。
        main.cpp(3) : 'CBase' の宣言を確認してください。

どうやらm_numはCBaseで宣言されたprivateな変数なのでサブクラスであるCSubからはアクセスできないみたいです。

なるほど、ほんとにそのクラス内からでしかアクセスできないんですね、privateって。

ということでとりあえずpublicでやってみました。

class CBase {
public:
    void PrintNum();
    int m_num;
};
$ main
100

できました。継承とは面白いものですね。