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

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

新規登録して質問してみよう
ただいま回答率
85.48%
継承

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

C++

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

Q&A

解決済

4回答

11750閲覧

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

marimo.

総合スコア48

継承

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

C++

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

0グッド

0クリップ

投稿2016/06/20 15:50

編集2016/06/21 06:39

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

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

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

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

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

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

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2016/06/20 22:01

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

回答4

0

ベストアンサー

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

<#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 08:55

編集2016/06/21 08:57
tnd-.-b

総合スコア247

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimo.

2016/06/21 14:41

個人的なモヤモヤがおそらく指摘いただいた内容そのものです。 ありがとうございます。 また、継承についての理解も深めていきたいと思います。 今まで自分はC言語しかまともに触ってた中でC++を学び始めたためこのような疑問が出てしまいました。
guest

0

こんにちは。

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

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


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

C++

1// ↓これは基底クラス 2class Base 3{ 4public: 5 int BaseX; 6}; 7 8// ↓Baseを継承したクラス 9class Derived : public Base 10{ 11public: 12 int DevivedY; 13}; 14 15// ↓derivedは、Derivedクラスのインスタンスです 16Drived derived;

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

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

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

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

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

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

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

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

投稿2016/06/20 16:22

編集2016/06/21 08:04
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2016/06/21 09:02

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2016/06/21 07:40

KairinP

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問