次のヘッダーfoo.hという仮定でき:なぜリンカーはカプセル化を保持しませんか?
class Foo {
private:
void print() const;
};
およびfoo.cpp次のメソッド印刷が宣言されていない限り
#include <iostream>
#include "foo.h"
void Foo::print() const {
std::cout << "Secret" << std::endl;
}
別のヘッダfoo1.h、すなわちfoo.hという同じです公共:
class Foo {
public:
void print() const;
};
、これはちょうどfoo1.hで印刷を呼び出すことmain.cppに、次のようになります。
#include "foo1.h"
int main() {
Foo f;
f.print();
return 0;
}
何私のために奇妙なようであることは、以下のリンクつもり作業その:
g++ foo.cpp -c -o foo.o
g++ main.cpp -c -o main.o
g++ main.o foo.o -o exec
./exec
最後のコマンドの出力は以下となります。Fooクラスの具体的な実装を知っているけど、知らなくてもそう
Secret
その宣言とそのオブジェクトファイルを持っているので、プライベート宣言されているにもかかわらずメソッドを使用できる状況を作り出すことができます。
私の質問は以下のとおりです。
なぜそれが動作しますか?リンカーは私的宣言と公的宣言を考慮しない?
この動作は実際には有効ですか?はいの場合、どのように使用されますか?私はそれがテストのために有用かもしれないと思います。
私はそれが未定義の動作だと思う。 C++言語の弁護士は確かにそれを証明することができますが、私はそれを公にして宣言して私的メンバー関数にアクセスしようとしているのは、未定義の振る舞いとして仕様に入れたものだと思います。しかし、私はC + +の専門家ではないので、評判の良い情報源からの回答を待つことが最善の方法です。 – dreamlax