ページ 11

引数のあるコンストラクタの継承について

Posted: 2008年9月18日(木) 08:25
by ゴリアス
はじめまして。ゴリアスと申します。
引数のあるコンストラクタの継承について調べたのですが、
期待する事柄を見つけ出すことができず基本的なことで申し訳ないですが質問させて頂きます。

OSはXP、コンパイラはBorland C++ 5.5.1、エディタはBCCディベロッパーを使ってます。

ただいま、Objectという基本クラスを継承したHeroというクラスを作成しています。
ObjectクラスとHeroクラスには両方とも引数のあるコンストラクタがあります。
この二つのクラスのコンストラクタの引数は数も型も全く違っています。
下のような感じです。

class Object{
public:
Object(int A);
};

class Hero:public Object{
public:
Hero(char* B,double C);
};

この場合にHeroクラスのインスタンスを生成しようとしたとき、例えば
Hero Hero1("abc",0.001);
という感じで渡した引数は親クラスと子クラスでどのように扱われるのでしょうか。
最初に親クラスのコンストラクタが呼び出されると思うのですが
親クラスのコンストラクタとは引数の数が違っていて・・・どうなるのでしょう。

基本的なことで本当にごめんなさい。

Re:引数のあるコンストラクタの継承について

Posted: 2008年9月18日(木) 10:13
by Mist
HeroのコンストラクタでObjectの初期化を行っていない場合、引数なしのコンストラクタがコールされます。
なので、提示されたものは引数なしのコンストラクタが定義されていないのでコンパイルエラーになります。
サンプルを書いてみましたので実行してみてください。
(BCCで確認していますが特殊なことはしていないのでVCでも問題ないと思います)
// ソース修正
#include    <iostream>
using namespace std;

class Object {
    public:
        Object(void) {
            printf("デフォルトコンストラクタ\n");
        };

        Object(int a) {
            printf("引数付きコンストラクタ1 %d\n", a);
        };
        Object(char *pc, double dval) {
            printf("引数付きコンストラクタ2 %s %f\n", pc, dval);
        };
};

class Hoge1 : public Object
{
    public:
        Hoge1(char *pc, double dval) {};
};

class Hoge2 : public Object
{
    public:
        Hoge2(char *pc, double dval) : Object(100) {};
};

class Hoge3 : public Object
{
    public:
        Hoge3(char *pc, double dval) : Object(pc, dval) {};
};

int main(void) {
    Hoge1   c1("abc", 0.1);
    Hoge2   c2("abc", 0.1);
    Hoge3   c3("abc", 0.1);
    return 0;
}

Re:引数のあるコンストラクタの継承について

Posted: 2008年9月18日(木) 11:20
by ゴリアス
Mistさん、お教えくださりありがとうございます!

なるほど、通常のコンストラクタの後ろに「:」をつければいいのですね。
このことを知らなくてずっと考えたり調べたりしておりました。

親切にコードまで書いていただき、感謝の言葉もございません!
本当にありがとうございます。