1. クラスの継承
class Shape{
};
class Circle : public Shape{
};
文法:
class B : public A{}
B は A を継承し、クラス A が親クラス、B が派生クラス (サブクラス) です。B が
A を継承すると、親クラス内のパブリック メンバーはすべて自動的に継承され、プライベート メンバーは継承できません。
新しい修飾子: protected
(1) このメンバーは、private など、外部からアクセスできません。
(2) このメンバーは、public などのサブクラスによって継承できます。
メモリ内の親クラスとサブクラスの関係を記述します。親クラスのメモリが前面にあり、
親クラスのプライベート メンバー変数もメモリ内に表示されますが、コンパイラによってアクセスが制限されます。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
class Shape{
public:
char name[16];
char size[16];
public:
void Show()
{
printf("%s ,%s \n",name,size);
}
protected:
int abc = 10;
};
class Circle : public Shape
{
//Circle自己的一些函数。
public:
void Play()
{
printf("abc = %d\n",abc);
}
};
int main()
{
Circle c;
strcpy(c.name,"xigua");
strcpy(c.size,"big");
c.Show();
c.Play();
return 0;
}
2. 仮想継承
1. 関数の書き換え
class Parent{
public:
void test()
{
printf("Parent.....\n");
}
};
class Child:public Parent
{
public:
void test()
{
Parent::test();
printf("Child.....\n");
}
};
3. 親クラスのポインタはサブクラスのオブジェクトを指すことができます
class Parent{
public:
int a ;
};
class Child:public Parent
{
public:
int b;
};
int main()
{
Child c;
c.a = 10;
c.b = 20;
Parent* p = &c;
printf("%d \n",p->a);
return 0;
}
4. 質問の導入:
Parent* p = new Child();
p->test();
これは誰のテストを指しますか?
class Parent{
public:
void test()
{
printf("Parent.....\n");
}
};
class Child:public Parent
{
public:
void test()
{
printf("Child.....\n");
}
};
int main()
{
Child ch;
Parent* p = &ch;
p->test();
return 0;
}
メンバー関数がサブクラスによってオーバーライドされる場合、親クラスはそれを virtual として宣言する必要があります。
親クラスの関数が vitural として定義されている場合、サブクラスの関数が呼び出されます。
class Parent{
public:
virtual void test()
{
printf("Parent.....\n");
}
};
class Child:public Parent
{
public:
void test()
{
printf("Child.....\n");
}
};
3. 構築と破棄について話しましょう
サブクラスのオブジェクトを作成する場合、
構築するときは、親クラスのコンストラクタを呼び出してから、サブクラスのコンストラクタを呼び出します
。 破棄するときは、サブクラスのデストラクタを呼び出してから、親クラスを呼び出します。のクラスコンストラクター
親クラスに複数のコンストラクターがある場合、そのうちの 1 つを明示的に呼び出すことができます。
明示的な呼び出しがない場合は、デフォルトでデフォルトのコンストラクターが呼び出されます。
コンストラクターとは何ですか
ビジョン: あらゆるものの設計と製造には、それが生まれる前からのビジョンと期待があります。コンストラクターの適切な期待は、オブジェクトの作成の開始時にオブジェクトを初期化することです。初期化中に関数呼び出しがあり、一部の関数を初期化する必要があります。完成しました。
手続き的なものは厳密で標準化されたものであるため、その名前には正確な意味が含まれることが多い 名前の意味のほとんどは単純なニックネームである 偉大で意味のあるものの発明は持ち運びにある 多くの意味がある 同じ名前は単なる名前にすぎない自分を特定のグループから識別できるコードネームです。多くの親が子供に名前を付けるのと同じように、名前を付けるときに、人生への良い期待を名前に組み込むこともできます。小さな命への期待を込めて、親の認識と認識ももたらします。人間としての命の祝福。
コンストラクターの名前は、定義されたクラスの名前と同じです。
それはカテゴリー全体に属するカテゴリーであるため、私たちはそれぞれ異なって生まれ、それぞれに独自の特徴があり、息が詰まるほど美しい人もいれば、中毒性があるほど深い人もいれば、痛いほど優しい人もいます。無数の違いが、広大な星のように無限の宇宙を形成します。ちょっとした違いで私たちは違うのではなく、私たちの小さな世界のすべてが少しずつ異なります。
コンストラクタは関数の配下にありますが、値を返さない関数です。
一と無限
多くのものは、その誕生から数えきれないほどの空想や推測を抱えていますが、賢い人間は、無限でも1でも、脳内でたくさんのことを構築し、活用することができます。米、油、塩といった日用品を前にしても、リアルに料理をすることもできる。
人は一つである、その数が無限であるために異なる 一つ星と星の海は違う 星の海の間にある無数の束縛は一つ星よりもずっと美しい夢想をもたらすだろう ペガサス流星、8月のライオン、時間そして宇宙旅行、そして星の海。
空のパラメーターを持つ複数のコンストラクターが存在する可能性があります。
フィードと目次の合理性
世の中の仕組みそのものが自分の役割を果たすことであり、それぞれが自分の小さな世界で自由闊達であり、志さえあれば人間自身も下から上へ働きかけることができる。小さな人間の生活には些細なことが多すぎるので、カタログの概要は標準に戻ることを思い出させるものであり、もう1つは量的変化が質的変化につながる体系性です。
すべてのクラスにはコンストラクターがあります。
コンストラクターが定義されていない場合、C++ コンパイラーはパラメーターを持たず、空の関数本体を含むデフォルトのコンストラクターを生成します。
定義すると、引数なしのコンストラクターが自動的に呼び出されます。
クラスが継承される場合、デストラクターは仮想であるとみなされる必要があります
:
Parent * p = &ch;
delete p;
プログラムがクラッシュする可能性があります
class Parent{
public:
Parent()
{
printf("Parent: 创建\n");
a = b = 0;
}
Parent(int x,int y)
{
printf("Parent: 创建 参数:%d, %d\n",x,y);
a = x;
b = y;
}
~Parent()
{
printf("Parent: 销毁\n");
}
private:
int a,b;
};
class Child:public Parent
{
public:
Child():Parent(1,2)//显式的调用
{
printf("Child: 创建\n");
}
~Child()
{
printf("Child: 销毁\n");
}
};
int main()
{
Parent* p= new Child();
delete p;
return 0;
}
**//改成virtual ~Parent**
4. 多重継承
父、母は 2 つのクラスを表します
クラス子:パブリック父、パブリック母{ };
多重継承の問題:複数の親クラスが同じ変数を持つとエラーが発生するので使う場所が減り、後から純粋仮想関数が絡んできます。