基本クラスと派生クラスのfriend関数を使って以下のように '+'演算子をオーバーロードしました。を使用して派生クラスオブジェクトのベース部分にアクセスする方法。演算子
#include <iostream>
using namespace std;
class base
{
private:
int x;
public:
base(int a) : x(a)
{
}
void printx()
{
cout << "x : " << x << endl;
}
friend void operator+(int data, base &obj);
};
void operator+(int data, base &obj)
{
cout << "in friend base" << endl;
obj.x = data + obj.x;
}
class derived : public base
{
private:
int y;
public:
derived(int a, int b) : base(a), y(b)
{
}
void printy()
{
cout << "y : " << y << endl;
}
friend void operator+(int data, derived &obj);
};
void operator+(int data, derived &obj)
{
cout << "in friend derived" << endl;
operator+(data, obj.base);
obj.y = data + obj.y;
cout << "y in friend : " << obj.y << endl;
}
int main()
{
derived c(2, 3);
4 + c;
c.printx();
c.printy();
}
しかし、以下のプログラムが正常にコンパイルなっているが、これは
inoverload+.cpp: In function ‘void operator+(int, derived&)’:
inoverload+.cpp:51:25: error: invalid use of ‘base::base’
operator+(data, obj.base);
以下のようにコンパイルエラーを与えています。
#include <iostream>
using namespace std;
class base
{
public:
int x;
base(int a) : x(a)
{
}
};
class d1 : public base
{
public:
d1(int a) : base(a)
{
}
};
class d2 : public base
{
public:
d2(int a) : base(a)
{
}
};
class derived : public d1, public d2
{
public:
derived(int a) : d1(a), d2(a)
{
}
};
int main()
{
derived obj(2);
cout << obj.d1::x << endl;
}
私は同じプログラムで同じことを行うことが可能だとして、最初のプログラムでは、派生クラスのオブジェクトを使用してベース部分にアクセスすることができなかった理由いずれかを説明していただけます。
注:私は既にキャストで試してみました。しかし、私の質問は、obj.baseを使ってベースにアクセスするのが正しくない場合です。これは、2番目のプログラムobj.d1 :: xでどのように正しいのでしょうか?
実際には、引数オブジェクトを変更しています。 – Knoep
@Knoep - あ、そうです。トンネルビジョン – StoryTeller
私は言及を忘れた。私はすでにキャストで試して、それは働いた。私の質問は、obj.baseが2番目のプログラムでなぜobj.d1を作成していないのかどうかです。 – kadina