2016-04-14 12 views
0

私は仮想関数とvtableを使いこなしていて、疑問がありました。基本クラスは、派生クラスのプライベートになり、民間、すべてのそれのメンバーとして導出されたときに基本クラスがプライベートで派生した場合、vptrを挿入したコンパイラはプライベートになりますか?

class base 
{ 
    public: 
    virtual void fun(){} 
}; 
class derived : private base 
{ 
    public: 
    void fun(){} 
}; 

スコープルールに:私は以下のようにコードの何かを持っていると仮定し 。コンパイラがvptr(vtableへのポインタ)を挿入すると、派生クラスに対してもプライベートになるのですか?

+4

'vptr'は裏側の概念です。直接アクセスすることもレイアウトを知ることもできないため、「非公開」にはなりません。しかし、それが意味することは、 '派生オブジェクト;を持つ人々は、コンパイラーがそれが私的継承であると不平を言うので、' base * b =&object; 'としてそれにアクセス(変換することも)できないということです。 – inetknght

+0

C++言語では 'vptr'のようなものはありません(ドラフト標準を検索し、あなた自身で見ることができます)。あなたの実装は、その名前で実装技術を使用する(または使用しない)ことがあります。それはプログラムには見えないので、プライベートであるかどうかを尋ねるのは意味がありません。 –

+0

@SergeyAあなたが他の人から引用した習慣に同意しないか、vtableの使用法の詳細のために –

答えて

1

それは、機能PTRエントリのvtableのだし、それがprivatepublicの面でのvtableについて話をする「不適切」ですが、それはコンパイラの詳細なので、それは常に「publicを」存在し、なります保持します。

私はこの問題の仕様に慣れていませんが、さまざまなコンパイラから生成されたC/C++コードのアセンブリをたくさん見てみると、仮想特化が必要ない場合(実行時またはその他の場合)は禁止されています。

+3

別の誤った**ベストプラクティス**。プライベートバーチャルはすばらしいツールです。なぜなら、誰かが混乱しているためにツールを使用しない理由は、まったく疑わしいことです。 – SergeyA

+0

私はベストプラクティスとの不一致を共感することができますが、実際の回答(vtableの実装)には何か問題がありますか? –

+0

プライベート仮想関数の間違った部分を削除すればOKです。 – SergeyA

関連する問題