Inheritance and copy constructor - how to initialize private fields from a base class?

I have 2 classes, A and B In A , I have 3 private fields. In class B I would like to write a copy constructor and initialize private fields from class A However, this does not work:

 #include <iostream> #include <string> using namespace std; class A { private: string *field1; string *field2; string *field3; double num1; public: A(string *o, string *n, string *m, double a=0) { field1 = new string(*o); field2 = new string(*n); field3 = new string(*m); num1 = a; } A(const A& other) { field1 = new string(*other.field1); field2 = new string(*other.field2); field3 = new string(*other.field3); num1 = other.num1; } void show() { cout << *field1 << " " << *field2 << " " << *field3 << "\n"; } ~A() { delete field1; delete field2; delete field3; } }; /*--------------------------------------------------------------------------------------------*/ class B : public A { private : double num2; double num3; public: B(double num2, double num3, string *o, string *n, string *num, double a=0) : A(o,n,num,a) { this->num2 = num2; this->num3 = num3; } B(const B& other) : A(other.field1, other.field2, other.field3, other.num1) { num2 = other.num2; num3 = other.num3; } void show() { cout << num2 << " " << num3 << "\n"; A::show(); } }; int main() { string o = "TEXT 111"; string *optr = &o; string n = "TEXT 222"; string *nptr = &n; string *numptr = new string("9845947598375923843"); A ba1(optr, nptr, numptr, 1000); ba1.show(); A ba2(ba1); ba2.show(); A ba3 = ba2; ba3.show(); B vip1(20, 1000, optr, nptr, numptr, 3000); vip1.show(); B vip2(vip1); vip2.show(); delete numptr; return 0; } 

I understand that when I switch from private to protected , it should work (and it works, of course), but how to deal with the situation that I have in my code? The question arises: how to initialize, in the copy constructor, private fields from the base class? I get the following errors with the current code:

 /home/yak/test.cpp|9|error: 'std::string* A::field1' is private| /home/yak/test.cpp|61|error: within this context| /home/yak/test.cpp|10|error: 'std::string* A::field2' is private| /home/yak/test.cpp|61|error: within this context| /home/yak/test.cpp|11|error: 'std::string* A::field3' is private| /home/yak/test.cpp|61|error: within this context| /home/yak/test.cpp|12|error: 'double A::num1' is private| /home/yak/test.cpp|61|error: within this context| ||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 
+5
source share
3 answers

All you have to do is call copy constructor A when copying construct B as

 B(const B& other) : A(other) { num2 = other.num2; num3 = other.num3; } 

Since B inherits from A , this is legal, and A will copy part of A other .

Also note that all of these pointers are not needed and make the code more complex. We could rewrite it like this:

 class A { private: string field1; string field2; string field3; double num1; public: A(const string& o, const string& n, const string& m, double a = 0) : field1(o), field2(n), feild3(m), num1(a) {} A(const A& other) field1(other.field1), field2(other.field2), feild3(other.feild3), num1(other.num1) {} void show() { cout << field1 << " " << field2 << " " << field3 << "\n"; } }; /*--------------------------------------------------------------------------------------------*/ class B : public A { private: double num2; double num3; public: B(double num2, double num3, const string& o, const string& n, const string& m, double a = 0) : A(o, n, num, a), num2(num2), num3(num3) {} B(const B& other) : A(other), num2(other.num2), num3(other.num3) {} void show() { cout << num2 << " " << num3 << "\n"; A::show(); } }; 
+6
source

When using the copy constructor for class B, you must call the copy constructor for class A.

So, replace your code with the following:

  B(const B& other) : A(other) { num2 = other.num2; num3 = other.num3; } 

Also declare a destructor from class A virtual. And I suppose you also want to do this for the show () method.

+1
source

You need to call the parent copy constructor from your copy constructor, giving it the same argument.

0
source

Source: https://habr.com/ru/post/1246642/


All Articles