ディレクトリ
仮想仮想機能を持たない関数のパラメータと基本クラスと同じ名前の派生クラスの仮想関数は、自動的に次のようになります。
1.1。ここでは、基本クラスで仮想関数を追加する必要があるが、派生クラスの仮想関数の同じ名前の同じパラメータが自動的に生成されました。
2.1。基本クラスの仮想キーワードが追加されていない場合、派生クラスの仮想関数の添加は生成することができません。
3.1。基本クラスと派生クラスが仮想キーワードに追加されていない場合は、関数呼び出しがオブジェクトに現在のポインタに依存するが、ベースクラスオブジェクトまたは派生クラスのオブジェクトです。(私はポリモーフィズムを使用していません)
派生オブジェクトの基本クラスのポインタであれば:
私たちは、最初に基本クラスの仮想関数は、関数が派生クラスのオブジェクトで同じポイントを呼び出し検討する機能は、ある場合には、関数ポインタを呼び出して、基本クラスの機能を検討します。
エクササイズをレクチャー:
A:多型のように見えます
トピックリンク:http://cxsjsx.openjudge.cn/hw202006/A/
#include <iostream>
using namespace std;
class B {
private:
int nBVal;
public:
void Print()
{ cout << "nBVal="<< nBVal << endl; }
void Fun()
{cout << "B::Fun" << endl; }
B ( int n ) { nBVal = n;}
};
class D :public B{
private:
int nDVal;
public:
D( int n):B(3*n){nDVal=n;}
void Fun()
{cout<<"D::Fun"<<endl;}
void Print()
{
B::Print();
cout<<"nDVal="<<nDVal<<endl;
}
};
int main() {
B * pb; D * pd;
D d(4); d.Fun(); //D::Fun
pb = new B(2); pd = new D(8);
pb -> Fun(); pd->Fun(); //B::Fun,D::Fun
pb->Print (); pd->Print (); //nBVal=2 nBVal=24,nDVal=8
pb = & d; pb->Fun(); //B::Fun
pb->Print(); //nBVal=12
return 0;
}
B:楽しい和ドゥ
トピックリンク:http://cxsjsx.openjudge.cn/hw202006/B/
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun()
{ cout << "A::Fun" << endl; };
void Do()
{ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do() //B相对与C是基类,使得C中Do成为虚函数
{ cout << "B::Do" << endl;}
};
class C:public B {
public:
void Do( )
{ cout <<"C::Do"<<endl; }
void Fun()
{ cout << "C::Fun" << endl; }
};
void Call(
B& p
) //先调用p.Fun(),那么由于类B中没有该函数,只好找继承的A中的函数。之后调用调用Do使先考虑B自身的,但由于有virtual关键字,考虑到引用的是一个C类对象,于是调用C类虚函数。
{
p.Fun(); p.Do();
}
int main() {
C c;
Call( c);
return 0;
}
C:どのような地獄を削除
トピックリンク:http://cxsjsx.openjudge.cn/hw202006/C/
#include <iostream>
using namespace std;
class A
{
public:
A() { }
virtual ~A(){ cout<<"destructor A"<<endl;}//这是虚析构函数的一个例子,基类析构函数前➕virtual,能保证析构一个派生类对象时,先调用派生类析构函数,再调用基类析构函数。
};
class B:public A {
public:
~B() { cout << "destructor B" << endl; }
};
int main()
{
A * pa; //如果这里是B*指针,就会自动调用派生类析构函数再调用基类析构函数,无虚析构函数的烦恼。
pa = new B;
delete pa;
return 0;
}
Dは:楽しさと行う方法です
トピックリンク:http://cxsjsx.openjudge.cn/hw202006/D/
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun()
{ cout << "A::Fun" << endl; };
virtual void Do()
{ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do()
{ cout << "B::Do" << endl;}
};
class C:public B {
public:
void Do( )
{ cout <<"C::Do"<<endl; }
void Fun()
{ cout << "C::Fun" << endl; }
};
void Call(
A* p
)
{
p->Fun(); p->Do();
}
int main() {
Call( new A()); //A::Fun A::Do
Call( new C());//A::Fun C::Do 首先考虑Fun和Do能否在基类函数中输出,如果有virtual关键字,再去找它所指向相应对象派生类的函数!
return 0;
}