Следующий фрагмент кода компилируется под 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.
Любые объяснения, почему это не работает должным образом?
Ваш базовый конструктор принимает эти значения … и полностью игнорирует их!
Изменить это:
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){...}
хоть.
ИМХО, вам нужно проверить, действительно ли вам нужен такой контроль над базовым классом. На самом деле вы не должны микроуправлять классом извне, это свидетельствует о недостатке в вашей иерархии классов.