Заставить списки инициализации работать с наследованием в переполнении стека

Следующий фрагмент кода компилируется под 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){}
4

Другие решения

Кажется, есть некоторая путаница в том, что вы хотите и как этого добиться.
Если я вас правильно понял, это то, что вы хотите:

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"
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){...} хоть.

ИМХО, вам нужно проверить, действительно ли вам нужен такой контроль над базовым классом. На самом деле вы не должны микроуправлять классом извне, это свидетельствует о недостатке в вашей иерархии классов.

1
По вопросам рекламы [email protected]