私のコードでは、3 つのクラスを使用しました。すべてのクラスは個別のファイルにあります。そしてMakefile
、それらをコンパイルしてリンクするために使用しています。以下の実装を参照してください。
class Medicine
{
int a;
}
class Pain:public Medicine
{
int b;
}
class Comb:public Pain
{
string salt,com;
}
すべてのクラスには、3 つのクラスすべてで、パラメータ化されたコンストラクタ、仮想デストラクタ、および同じ名前の関数がありcall()
ます。そしてcall()
、のようです
call()
{
cout<<"You are in class the_name_of_the_class"<<endl;
}
のコードは次のmain.cpp
ようになります。
int main()
{
Medicine *p[2];
p[0]= new Comb("Salt","Com",2,110);
p[1]= new Comb("SALT","COM",1,100);
p[0]->call();
delete p[0];
delete p[1];
return 0;
}
このプログラムを実行すると、期待どおりの出力が得られました。しかし、Medicine::call() を仮想関数に変更し、再度make
コマンドを使用すると、すべてのファイルが最新であると表示されます。を変更medicine.h
したので、make
の新しいバージョンを作成する必要がありmedicine.o
ます。medicine.o
を変更したのに古いと見なされるのはなぜmedicine.h
ですか?
Makefile は次のようになります。
using .PHONY:clean
OBJ:=medicine.o pain.o comb.o main.o
SOU:=medicine.cpp pain.cpp comb.cpp main.cpp
main:$(OBJ)
g++ -o $@ $^
%.o:%.cpp
g++ -c -o $@ $<
clean:
rm *.o main
もしあなたがmedicine.hの実装を見たいなら、
class Medicine
{
int cost;
public:
int getCost();
void setCost(int);
Medicine();
Medicine(int);
Medicine(Medicine &a);
virtual string getCompany(){};
virtual string getSalt(){};
virtual ~Medicine ();
virtual void call();
};
これは、これらすべての関数が定義されmedicine.h
ている に含めました。medicine.cpp