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

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

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

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

Q&A

解決済

2回答

1321閲覧

override関数呼び出しの安全性

hoge111

総合スコア17

C++

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

0グッド

0クリップ

投稿2021/04/15 11:36

編集2021/04/15 11:49

????いつもありがとうございます

##簡潔な質問

????次のコードは未定義動作やアクセス違反を起こさない(安全)かが知りたいです

cpp

1#include <iostream> 2#include <memory> 3 4struct A { 5 virtual ~A() = default; 6 virtual void hoge() = 0; 7}; 8 9struct B : A { 10 int b = 0; 11 void hoge() override { std::cout << b << std::endl; }; 12}; 13 14 15int main() { 16 17 std::unique_ptr<A> ptr = std::make_unique<B>(); 18 19 ptr->hoge(); 20} 21

##質問詳細(考えたこと)

:std::unique_ptr<A> ptr = std::make_unique<B>();

この段落でclass Bの親であるclass Aの情報しかptrには載らないと考えているのですが、もしそうであれば関数hogeで破棄されたメンバ変数bのアドレスから数値を読み取ってきているので未定義動作を引き起こすのだろうかと思いました

しかし仮想関数が良い感じに何かやってくれているのではとも勘ぐってしまいます

##環境
visual studio2019
vc++ latest(c++20)
最適化off

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

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

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

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

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

guest

回答2

0

具体的な実装方法を知れば、安心できるのではないでしょうか。
「C++ vtable」あたりで検索してみてください。

投稿2021/04/15 19:14

actorbug

総合スコア2431

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

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

hoge111

2021/04/16 00:41

ありがとうございました????
guest

0

ベストアンサー

ポインタ ptr が指しているのは実際はBのインスタンスですから、B::bへのアクセスはまったくもって安全です。

むしろ、存在しない A::hoge() ではなく、ちゃんと B::hoge() が呼ばれることのほうが初学者には不思議なのではないのかな、と思います。

投稿2021/04/15 13:15

int32_t

総合スコア21695

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

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

hoge111

2021/04/16 00:43

ありがとうございました???? class Aにupcastされた時点でclass B分のメモリが解放されるものだと思っていました????
int32_t

2021/04/16 01:10

ええ、ポインタのキャストでメモリの確保や開放は起きないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問