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

好的,我不明白您到底想要什么以及为什么,但这里有一个建议,使用 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 回答
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 == 10,a.c == "Hi"
  • a1.x == 2,a1.c == "foo"
  • b.x == 20,b.c == "Hello"
于 2012-10-06T09:13:17.763 回答