#include < iostream >
using namespace std;
class base{
public:
int i;
};
class derived1 : virtual public base {
public:
int j;
};
class derived2 : virtual public base{
public:
int k;
};
class derived3 : public derived1, public derived2{
public:
int product() { return i * j * k; }
};
int main()
{
derived3 ob;
ob.i = 10;
ob.j = 3;
ob.k = 5;
cout << "multiply is " << ob.product() << '\n';
return 0;
}
派生クラスが複数の基本クラスを直接継承
#include < iostream >
using namespace std;
class B1 {
public:
B1() { cout << "B1 constructor call \n"; }
~B1() { cout << "B1 destructor call \n"; }
};
class B2 {
int b;
public:
B2() { cout << "B2 contructor call \n"; }
~B2() { cout << "B2 destructor call \n"; }
};
class D : public B1, public B2{
public:
D() { cout << "call D constructor\n"; }
~D() { cout << "call D destructor\n"; }
};
int main()
{
D ob;
return 0;
}
多重継承
#include < iostream >
using namespace std;
class B1 {
int a;
public:
B1(int x){ a = x; }
int geta() { return a; }
};
class D1 : public B1 {
int b;
public:
D1(int x, int y): B1(y)
{
b = x;
}
int getb(){ return b; }
};
class D2 : public D1 {
int c;
public:
D2(int x, int y, int z): D1(y, z)
{
c = x;
}
void show() {
cout << geta() << ' ' << getb() << ' ';
cout << c << '\n';
}
};
int main()
{
D2 ob(1, 2, 3);
ob.show();
cout << ob.geta() << ' ' << ob.getb() << '\n';
return 0;
}
APR偽装
データリンク層の1つであるイーサネットでは、送信元と送信先のアドレスの指定にMACアドレスを利用しています。インターネット層におけるIPアドレスとMACアドレスの対応付けを担っているのがAPR(address resolution protocol)です。
コンピュータはAPRテーブルに一定期間、IPとMACの組をキャッシュとして保持しています。このキャッシュは、偽造したARPパケットを送信することで書き換え可能です。これで、通信を妨害することもあり得ます。
対策としては、IPSecのAHを利用する方法や、アプリケーションならびに通信路の暗号化と認証強化を行う方法があります。
派生クラスと基本クラス
#include < iostream >
using namespace std;
class base {
int i;
public:
base(int n){
cout << "call base class constructor\n";
i = n;
}
~base() { cout << "call base class destructor\n"; }
void showi() { cout << i << '\n'; }
};
class derived : public base {
int j;
public:
derived(int n, int m): base(m){
cout << "call derived class constructor \n";
j = n;
}
~derived() { cout << "call derived class destructor\n"; }
void showj() {cout << j << '\n'; }
};
int main()
{
derived o(10, 20);
o.showi();
o.showj();
return 0;
}
コンストラクタ、デストラクタ、継承
#include < iostream >
using namespace std;
class base {
public:
base() { cout << "call base class constructor\n"; }
~base() { cout << "base class destructor\n"; }
};
class derived : public base {
public:
derived() { cout << "call derived class constructor\n"; }
~derived() { cout << "call derived class destructor\n";}
};
int main()
{
derived o;
return 0;
}
被保護メンバがpublicとして継承
#include < iostream >
using namespace std;
class base {
protected:
int a, b;
public:
void setab(int n, int m){ a = n; b = m; }
};
class derived : public base {
int c;
public:
void setc(int n) { c = n; }
void showabc(){
cout << a << ' ' << b << ' ' << c << '\n';
}
};
int main()
{
derived ob;
ob.setab(1, 2);
ob.setc(3);
ob.showabc();
return 0;
}
被保護メンバの使用
#include < iostream >
using namespace std;
class samp {
int a;
protected:
int b;
public:
int c;
samp(int n, int m){ a = n; b = m; }
int geta() { return a; }
int getb() { return b; }
};
int main()
{
samp ob(10, 20);
ob.c = 30;
cout << ob.geta() << ' ';
cout << ob.getb() << ' ' << ob.c << '\n';
return 0;
}
基本クラスのアクセス制御
#include < iostream >
using namespace std;
class base {
int x;
public:
void setx(int n){ x = n; }
void showx() { cout << x << '\n'; }
};
class derived : public base {
int y;
public:
void sety(int n){ y = n; }
void showy() { cout << y << '\n'; }
};
int main()
{
derived ob;
ob.setx(10);
ob.sety(20);
ob.showx();
ob.showy();
return 0;
}