使初始化列表与 C++ 中的继承一起使用
Making initialization lists work with inheritance in C++
以下代码段在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 == 10
,a.c == "Hi"
-
a1.x == 2
,a1.c == "foo"
-
b.x == 20
,b.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){...}
。
恕我直言,您需要首先查看是否真的需要对基类进行那么多的控制。你真的不应该像这样从外部微观管理一个类,这表明你的类层次结构存在缺陷。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 如何将enable-if与模板参数和参数包一起使用
- 如何在 c++ 中将多重继承与组合一起使用?
- 有没有一种干净(更)的方法将 CRTP 与可变参数继承混合在一起?
- 与lambda一起使用虚拟继承在初始化列表中捕获此问题的GCC错误
- 我可以将boost_fusion_adapt_struct与继承的东西一起使用
- 将initalizer列表与从空基类继承的结构一起使用
- C++ 继承函数指针,可与派生方法一起使用
- 将 Boost.Serialization 直接与虚拟钻石继承一起工作
- 将继承与基于Stdector的羊群一起使用
- 使初始化列表与 C++ 中的继承一起使用
- C++ 继承和组合一起使用
- 将非虚拟接口和多级继承结合在一起
- 不能将兄弟方法与虚拟继承 cpp 一起使用
- 为什么重载在Java中与继承一起工作
- 将shared_ptr与多继承类一起使用
- 将未声明的标识符与模板和继承跟进一起使用
- 继承和记忆-它们是如何一起工作的