基底クラス : 派生クラス と定義したとき、派生クラスで引数付きコンストラクタを定義するとコンパイルが通らない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
norm

基底クラス : 派生クラス と定義したとき、派生クラスで引数付きコンストラクタを定義するとコンパイルが通らない

#1

投稿記事 by norm » 13年前

下のコードは、superクラスと、それを継承したsubクラスを定義してます。
superクラスで引数aのコンストラクタを定義(中身は適当です。)して、
subクラスでオーバーライドしています。

コード:

class super {
public:
	super(int a) { a=a; }
};

class sub : public super {
public:
	sub(int a) { a; }    //エラー箇所
};

int main() {
	sub s(1);
	return 0;
}
コンパイラしたとき、//エラー箇所で

>> error C2512: 'super' : クラス、構造体、共用体に既定のコンストラクターがありません。
と言われてしまいます。

subクラスを継承した孫クラスなども順々に作っていきたいのですが、
地道に
protected:
super(){ }
などを作って行かないといけないのでしょうか?
何かこれに対する対策は無いのでしょうか?

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: 基底クラス : 派生クラス と定義したとき、派生クラスで引数付きコンストラクタを定義するとコンパイルが通らない

#2

投稿記事 by YuO » 13年前

派生クラスに引数付きコンストラクタがあるからでは無く,
基底クラスに引数付きコンストラクタしかなく,それを派生クラスで呼び出していないためにエラーになっています。

コード:

sub (int a) : super(a) { /* ... */ }
のように,基底クラスのコンストラクタを正しく呼び出せばエラーになりません。

norm

Re: 基底クラス : 派生クラス と定義したとき、派生クラスで引数付きコンストラクタを定義するとコンパイルが通らない

#3

投稿記事 by norm » 13年前

回答ありがとうございます!
YuO さんが書きました:

コード:

sub (int a) : super(a) { /* ... */ }
この
: super(a)
とは、何でしょうか?

前に、同じ部分に

コード:

sub (int n) : num(n) { /* ... */ }
というのも見たことがあるのですが・・・
numは親クラスのメンバ変数(関数ではなく)だった気がします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 基底クラス : 派生クラス と定義したとき、派生クラスで引数付きコンストラクタを定義するとコンパイルが通らない

#4

投稿記事 by softya(ソフト屋) » 13年前

コンストラクタの初期化子リストですね。
メンバ変数やメンバのクラスの初期化などで使います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: 基底クラス : 派生クラス と定義したとき、派生クラスで引数付きコンストラクタを定義するとコンパイルが通らない

#5

投稿記事 by YuO » 13年前

norm さんが書きました:この
: super(a)
とは、何でしょうか?
コンストラクタ初期化子です。
コンストラクタにおいて,自身の複文を実行する前に初期化を行うための構文です。
norm さんが書きました:前に、同じ部分に

コード:

sub (int n) : num(n) { /* ... */ }
というのも見たことがあるのですが・・・
コンストラクタ初期化子では,
  • 仮想基底クラス
  • 直接の基底クラス
  • そのクラスに定義された非静的メンバ変数
の初期化を行います。
なので,メンバ変数の初期化もおなじ場所に出てきます。
norm さんが書きました:numは親クラスのメンバ変数(関数ではなく)だった気がします。
親クラスのメンバ変数は初期化できません (それは親クラスの役割)。


Norm

Re: 基底クラス : 派生クラス と定義したとき、派生クラスで引数付きコンストラクタを定義するとコンパイルが通らない

#7

投稿記事 by Norm » 13年前

自分用メモメモメモメ
YuO さんが書きました:
norm さんが書きました:この
: super(a)
とは、何でしょうか?
コンストラクタ初期化子です。
コンストラクタにおいて,自身の複文を実行する前に初期化を行うための構文です。
//==================
super は、関数名ではなく、基底クラス名
基底クラスが、

コード:

class Oya {
  public:
    int num;
    Oya(int a) { ... } }
なら、サブクラスでは

コード:

class Ko {
  public:
    Ko(int a, int n) Oya(a), num(n) { ... } } 
:
とかにする。

閉鎖

“C言語何でも質問掲示板” へ戻る