これは多くの質問が寄せられていることは知っていますが、私が見つけた唯一の答えは、(int *)などを使用してconst-nessが実際にキャストされたときでした。キャストが含まれていないのに、const修飾子がconstオブジェクトのポインター型メンバー変数で機能しないのはなぜですか?
#include <iostream>
class bar {
public:
void doit() { std::cout << " bar::doit() non-const\n"; }
void doit() const { std::cout << " bar::doit() const\n"; }
};
class foo {
bar* mybar1;
bar mybar2;
public:
foo() : mybar1(new bar) {}
void doit() const {
std::cout << "foo::doit() const\n";
std::cout << " calling mybar1->doit()\n";
mybar1->doit(); // This calls bar::doit() instead of bar::doit() const
std::cout << " calling mybar2.doit()\n";
mybar2.doit(); // This calls bar::doit() const correctly
}
// ... (proper copying elided for brevity)
};
int main(void)
{
const foo foobar; // NOTE: foobar is const
foobar.doit();
}
上記のコードは、次の出力を生成します(gcc 4.5.2およびvc100でテスト済み)。
foo :: doit()const mybar1-> doit()を呼び出す bar :: doit()non-const <-なぜですか? mybar2.doit()を呼び出す bar :: doit()const