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

axi*_*xis 3 c++ inheritance initializer-list

下面的代码被编译在 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);
}
Run Code Online (Sandbox Code Playgroud)

但它没有做应该做的事情,类型 B 无法更改它从 A 继承的那 2 个变量的值。

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

chr*_*ris 5

您的基本构造函数采用这些值……并完全无视它们!

改变这个:

A(int x,std::string c):x(10),c("Hi"){}
Run Code Online (Sandbox Code Playgroud)

对此:

A(int x,std::string c):x(x),c(c){}
Run Code Online (Sandbox Code Playgroud)

  • @axis 为什么不使用 `A(int x = 10,std::string c = std::string("Hi")):x(x),c(c){ ... ` (3认同)
  • @axis 几乎没有其他方法可以做您想做的事情,如果您担心可读性,您总是可以巧妙地使用空格。例如,为每个参数使用单独的一行并很好地对齐它们。我相信任何经验丰富的 C++ 开发人员都可以在喝 2 瓶伏特加酒后直观地解析函数参数的默认值。如果您担心当您有 5 个参数时这将如何扩展,请使用 `boost::parameter` 库。 (2认同)