質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

653閲覧

キャストして代入して代入元をdeleteするとどんなことをしているのか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/08/10 13:05

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; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実体ではなく、アドレスを代入してます
なので、実体はxを経由して、base* としてアクセスできます

投稿2019/08/10 13:14

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問