質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C++

    4434questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • 継承

    46questions

    継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

C++のclass継承と#includeの違い

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,795

marimo.

score 40

C++を学んで日が浅い者です.

classの継承と#includeで理解がこんがらがってしまい質問させていただきました.

classの継承と#includeで読み込んだクラスはどう使い分けるのでしょうか?
そもそも機能的な違いや開発上の用途によって継承と#includeはどのように使い分けられているのでしょうか?

稚拙な質問で恐縮ではありますが宜しくお願い致します.

----- 追記 ------
自分自身も正直わからないことがわからない、とういうような状況で質問してしまいました。
回答してくださった方にはご迷惑をお掛けしました。深くお詫び申し上げます。

さて、詳しい点ですが、自分なりにわからないところを具体的に考えてみました。

  1. クラスを継承することのメリットとして、ひとつのインスタンスから多くのメンバーメソッドにアクセスできることなのではないのでしょうか?
  2. 機能が違うなら継承はせずに、ヘッダファイルとしておくことで必要なときにincludeをして関数を呼び出す、というイメージであっていますでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2016/06/21 07:01

    違っていたならごめんなさいなのですが、ヘッダファイル(#includeされた)に定義されたクラスを他のクラスで継承することを言っているのでしょうか? もしそうなら継承されるクラスと継承するクラスの定義を提示してはどうでしょう?(ソースがないのならヘッダファイルのAクラスがBクラスで継承されるのですが・・・)などでもいいと思います。

    キャンセル

回答 4

checkベストアンサー

+1

イメージとマッチするかわかりませんが、それぞれの用途は以下の通りです。

<#include>  こちらはある程度ご存知かと思います。
あるパッケージ(ライブラリ等)に定義してある関数や、クラスを
利用したい時に利用。
オブジェクト指向プログラミングにかぎらず使う。

<クラス継承>  こちらが「よくわからないぞ?」という状態かと思います。
あるクラスの性質(属性、操作)を受け継ぎたい時に利用。
オブジェクト指向プログラミングで使う。

皆さんのコメントにもある通り、場面に応じて使い分けるような分類が
できるものではありません。

~~~~
「わざわざ継承しなくても、パッケージ(ライブラリ)のように
しておいて、必要に応じて#includeしてメソッドを呼べばいい
じゃないか。どうして継承なんて使うんだ?」

という趣旨の疑問であれば、まあ、その通り。継承は使わなくて良いです。

例えば、以下のようなクラスがあったとします。
(クラスとオブジェクトにまで話しが広がらないよう、staticなメソッドにしてます。)

calc.h

class Calc {
 public:
  // 与えた値の1000倍を返す
  static int K(int n) {
    return (n * 1000);
  }
}

この関数を使うために、継承を利用できます。
(hoge.cppからcalc.hを見るためにincludeしてます。)

hoge.cpp

#include "calc.h"

class Hoge : public Calc {
  // xの1000倍の数字を印字する
  static void printK(int x) {
    printf("%d\n", K(x));
  }
}

しかし、この場合、わざわざ継承を行わなくても、以下のように
呼び出すことができます。
(同じく、hoge2.cppからcalc.hを見るためにincludeしてます。)

hoge2.cpp

#include "calc.h"

class Hoge2 {
  // xの1000倍の数字を印字する
  static void printK(int x) {
    printf("%d\n", Calc.K(x));
  }
}

~~~~

重要なポイントとして
「ある機能のメソッドを使いたい(関数を呼びたい)から継承する」
のは誤りです。

上記のように誤解していますと、「あるパッケージの関数を使いたいから
#includeする」に似ているな。何が違うんだろう?という誤った印象を
お持ちになるかもしれません。

継承は「親クラスの性質を引き継ぐ」「呼び出し側と呼び出される側を疎にする」
といった目的で作られた、オブジェクト指向プログラミング言語の機能です。

継承する場合、継承しない場合の使い分け等、もやもやするかもしれませんが、
Chironianさんの回答等を参考に学習を進め、徐々に理解を深めて頂ければと思います。
新しい疑問が出た時は、またこういった場で質問なさるのも良いかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/21 23:41

    個人的なモヤモヤがおそらく指摘いただいた内容そのものです。
    ありがとうございます。
    また、継承についての理解も深めていきたいと思います。

    今まで自分はC言語しかまともに触ってた中でC++を学び始めたためこのような疑問が出てしまいました。

    キャンセル

+1

こんにちは。

#includeは、指定したファイルをその位置へ読む込む(展開する)だけの機能です。それ以上でもそれ以下でもありません。従って、classの継承と#includeで読み込んだクラスの使い分けは存在しません。

質問されたいことはこのような内容ではないような気もするのですが、質問が抽象的なので良く分かりません。できるだけ具体的に踏み込んでみて頂けないでしょうか?
継承したクラスの例や、#includeで読み込んだクラスの名前を提示頂けると何かアドバイスできるかも知れません。


【追記】
どうもmarimo.さんがおっしゃる「クラスの継承」が、本来の意味と異なっているような気がします。
クラスを継承するとは、例えば下記です。

// ↓これは基底クラス
class Base
{
public:
    int BaseX;
};

// ↓Baseを継承したクラス
class Derived : public Base
{
public:
    int DevivedY;
};

// ↓derivedは、Derivedクラスのインスタンスです
Drived derived;

1.クラスを継承することのメリットとして、ひとつのインスタンスから多くのメンバーメソッドにアクセスできることなのではないのでしょうか?

そのような事実はないような気がします。

クラス自身のメリットは多数ありますが、私はデータ構造とアルゴリズムをセットにできることが一番ありがたいです。
そして、クラスを継承することで、派生クラスに基底クラスの機能を取り込みつつ、機能を修正できるのでなかなか便利です。また、ポリモーフィズムもたいへん便利です。

2.機能が違うなら継承はせずに、ヘッダファイルとしておくことで必要なときにincludeをして関数を呼び出す、というイメージであっていますでしょうか?

仰りたいことがよく理解できていませんが、たぶん間違っています。
「クラスを継承すること」と「関数呼び出しのためにincludeすること」の間にトレードオフの関係はないと思います。

抽象的に物事を考えると混乱します。具体的に考えましょう。
そして、ソース・コードはたいへん具体的です。

mario.さんが考えている「クラスを継承」しているソースを上記のように記述してみてください。
「ひとつのインスタンスから多くのメンバーメソッドにアクセス」している例をソースで提示してみてください。
「機能が違うなら」は何と何の機能が違うのでしょうか?
「継承はせず」のソース(継承しなかった時のソース)を簡単で良いので書いてみて下さい。
「ヘッダファイルとしておくことで必要なときにincludeをして関数を呼び出す」部分も短いソースを提示してみて下さい。ヘッダ・ファイルとそれを#includeして関数を呼び出しているソースの2つです。

恐らく具体的に書く過程である程度整理でき、より的確な質問ができるようになると思います。
仮に整理できなかったとしてもソースを提示して質問すれば、ある程度意図が伝わると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

多分もう少し継承について調べてから質問したほうがいいと思います。
そのほうがより理解できると思いますし。

includeと継承は使い分けるものではなく、基本的には同時に使うものです。
乱暴な例を挙げると、生物クラスの子クラスである人間クラス(継承)が、箸クラスを使うために箸.hをincludeしたりします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

#includeとクラスの継承を同じレベルで比較するのがそもそもおかしいと思います。
コンパイラのディレクティブと、C++言語の命令や記法の比較はできません。
それぞれの詳細は、他の方の回答のとおりです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C++

    4434questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • 継承

    46questions

    継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。