使初始化列表与 C++ 中的继承一起使用

Making initialization lists work with inheritance in C++

本文关键字:继承 一起 C++ 初始化 列表      更新时间:2023-10-16

以下代码段在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 个变量的值。

关于为什么这不能正常工作的任何解释?

您的基构造函数采用这些值...并完全无视他们!

更改此设置:

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

对此:

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

对于你想要什么以及如何实现这一目标似乎有些困惑。如果我做对了,这就是你想要的:

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"

好吧,我不明白你到底想要什么以及为什么,但这里有一个建议,使用 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){...}

恕我直言,您需要首先查看是否真的需要对基类进行那么多的控制。你真的不应该像这样从外部微观管理一个类,这表明你的类层次结构存在缺陷。