3

次のコードは以下でコンパイルされますg++ 4.6.3 for Linux

#include <iostream>

class A {
  public:  

    int x;
    std::string c;

    A(int x,std::string c):x(10),c("Hi"){
    }

    ~A(){
      std::cout << "Deleting A()" << std::endl;
    }
};

class B : public A {
  public:

    B():A(20,"Hello"){
    }

    ~B(){
      std::cout << "Deleting B()" << std::endl;
    }
};

int main(){
  B o;
  std::cout << o.x << std::endl;
  std::cout << o.c << std::endl;
  return(0);
}

ただし、本来の機能は実行されません。タイプBは、Aから継承する2つの変数の値を変更できません。

これが正しく機能しない理由についての説明はありますか?

4

3 に答える 3

5

基本コンストラクターはそれらの値を取ります...そしてそれらを完全に無視します!

これを変える:

A(int x,std::string c):x(10),c("Hi"){}

これに:

A(int x,std::string c):x(x),c(c){}
于 2012-10-06T08:07:52.707 に答える
1

あなたが何を望んでいるか、そしてこれをどのように達成するかについて、いくらかの混乱があるようです。私があなたを正しく理解した場合、これはあなたが望むものです:

class A {
  public:  

    int x;
    std::string c;
    //default initization of A
    A():x(10), c("Hi") {}

    //initializing the values of A via parameters
    A(int x,std::string c):x(x),c(c){}

    ~A(){
      std::cout << "Deleting A()" << std::endl;
    }
};

class B : public A {
  public:

    B():A(20,"Hello"){
    }

    ~B(){
      std::cout << "Deleting B()" << std::endl;
    }
};

したがって、この例では:

int main()
{
    A a;
    A a1(2, "foo");
    B b;
    return 0;
}
  • a.x == 10a.c == "Hi"
  • a1.x == 2a1.c == "foo"
  • b.x == 20b.c == "Hello"
于 2012-10-06T09:13:17.763 に答える
1

OK、あなたが何を望んでいるのか、そしてその理由はわかりませんが、C ++ 11を使用すると、次のことができるという提案があります。

struct Base {
        int a;
        float b;
};

struct Derived: public Base {
        Derived(): Base{1,1.0} {}
};

int main() {
        Derived d;
}

ベースがPODタイプである限り。

私はまだ好きA(int x = 10,std::string c = std::string("Hi")):x(x),c(c){...}です。

私見ですが、そもそも基本クラスをそれほど細かく制御する必要があるかどうかを確認する必要があります。このように外部からクラスを細かく管理することは実際には想定されていません。これは、クラス階層に欠陥があることを示しています。

于 2012-10-06T10:57:15.427 に答える