Main関数のコメント部なのですがキャスト元の変数をdeleteで実体を消してもキャスト先のx変数でアドレス先を参照できるためアドレスではなく実体をコピーしてると思うのですがこれはどうなのでしょうか?この代入は実体のコピーでしょうか?
#include <iostream> #include <ctime> #include <cstdlib> class base { private: int *ar = NULL; int d = 0; public: base(int x) { d = x;//配列の個数 ar = new int[x]; for (int i = 0; i < x; i++) { ar[i] = rand() % 100; } std::cout << "base\n"; } base(const base& x)//コピーコンストラクタ { if (this != &x) { if (this->d == x.d) { for (int i = 0; i < d; i++) { this->ar[i] = x.ar[i]; } } else { if (this->d < x.d) { //int r = x.d - this->d; for (int i = 0; i < this->d; i++) { this->ar[i] = x.ar[i]; //delete(this->ar); } } else { //int r = this->d - x.d; for (int i = 0; i < x.d; i++) { this->ar[i] = x.ar[i]; // delete(x.ar); } } } } std::cout << "copy constructor\n"; } ~base() { delete(ar); std::cout << "base Destructor\n"; } //void f()//オーバーライド virtual void f()//オーバーライド { std::cout << "base f()\n"; //std::cout << a << std::endl; } void p() { for (int i = 0; i < d; i++) { std::cout << "ar[" << i<<"]: "<< ar[i] << std::endl; } } base& operator = (const base& x) { std::cout << "base operator = \n"; if (this != &x) { if (this->d == x.d) { for (int i = 0; i < d; i++) { this->ar[i] = x.ar[i]; } } else { if (this->d < x.d) { //int r = x.d - this->d; for (int i = 0; i < this->d; i++) { ar[i] = x.ar[i]; //delete(this->ar); } } else { //int r = this->d - x.d; for (int i = 0; i < x.d; i++) { this->ar[i] = x.ar[i]; // delete(x.ar); } } } return *this; } } void x(int t) { std::cout << t <<"x()\n"; } }; class derived : public base { public: derived(int t):base(t) { std::cout << "deirved\n"; } void x(int x) { std::cout << "d x()\n"; std::cout << x; } ~derived() { std::cout << " derived Destructor\n"; } void df() { std::cout << "df()"; } void f() override { std::cout << "deiverd f()\n"; //std::cout << a << std::endl; // return 3; } }; int main() { base *b_d = new derived(2); base* b_b = new base(3); derived* dd = new derived(3); dd->x(1); base* x = (base*)dd;///////////ここ delete(dd); dd = NULL; // dd->x(2); x->x(2); //delete(dd); // x->x(2); int c_ = getchar(); return 0; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。