class C
{
int noOfMeeting;
};
class A
{
public:
Student(char *pName="no name");
...
protected:
};
class B
: public A{
public:
B(char *pName, Advisor &adv)
: Student(pName) //父类初始化
{
}
};
.多态 子类中对父类已有成员函数进行重新定义(返回类型和参数不变,只是改变函数的内部代码实现方式, 否则就得了重载而非多态), 并加上virtual声明为虚函数,从而形成多态, 在调用此系列成员函数时由对象所属的类自动来区别调用哪个函数
class A
{
public:
virtual int getAge() {
}
}
class B :public A
{
public:
virtual int getAge() {
}
}
.虚函数限制1) 只有类的成员函数才能成为虚函数
2) 静态成员不能是虚函数, 因为他不受限于具体对象
3) 内联函数不能是虚函数, 因为它不能在运行中动态确定其位置的
4) 构造函数不能时虚函数, 因为构造时对象还是一片未定型的空间
5) 析构函数可以是虚函数, 而且通常声明为虚函数, 如基类对象和子类对象以不同方式申请了堆空间后:
void finishWithObject(Base *pHeapObject)
{
//..
delete pHeapObject;
}
pHeapObject是传递过来的一个对象指针, 它或者指向基类对象或指向子类对象。 在执行delete pHeapObject时, 要调用析构函数,但是执行基类的析构函数?还是执行子类的析构函数? 将析构函数声明为虚的,就可以解决这个问题
.继承的访问控制
public:
1)子类可以继承
2)继承后的访问控制是public
protected:
1)子类可以继承
2)继承后的访问控制是protected
private:
1)子类不可以继承
.protected和private
1)在本类中两者都可以被任意成员访问
2)在对外部调用时, 两者都不能访问 (也就是以对象方式不可访问, 如obj.proMember , obj.privMember)
3)基类的protected成员,在子类中可以被访问
基类的private的成员,在子类中不可以访问
class Base
{
public:
int pPub;
protected:
int pPro;
private:
int pPriv;
};
class PrivateClass: private Base //私有继承
{
public:
void test()
{
pPub=1; //ok:将pPub据为private
pPro=2; //ok:将pPub据为private
pPriv=3; //Error: 不可访问
}
};
class DerivedFromPri: public PrivateClass
{
public:
void test()
{
pPub=1; //Error: 不可访问
pPro=2; //Error: 不可访问
pPriv=3; //Error: 不可访问
}
};
class ProtectedClass: protected Base
{
public:
void test()
{
pPub=1; //ok: 据为protected
pPro=2; //ok: 据为protected
pPriv=3; //Error: 不可访问
}
};
class DerivedFromPro :public ProtectedClass
{
public:
void test()
{
pPub=1; //ok: 据为protected
pPro=2; //ok: 据为protected
pPriv=3; //Error: 不可访问
}
};
class PublicClass :public Base //公共继承
{
public:
void test()
{
pPub=1; //ok:将pPub据为pubblic
pPro=2; //ok:将pPub据为protected
pPriv=3; //Error: 不可访问
}
};
class DerivedFromPub :public PublicClass
{
public:
void test()
{
pPub=1; //ok:将pPub据为pubblic
pPro=2; //ok:将pPub据为protected
pPriv=3; //Error: 不可访问
}
};
int main()
{
PrivateClass priObj;
priObj.pPub = 1; //Error
priObj.pPro = 1; //Error
priObj.pPriv = 1; //Error
ProtectedClass proObj;
proObj.pPub = 1; //Error
proObj.pPro = 1; //Error
proObj.pPriv = 1; //Error
PublicClass pubObj;
pubObj.pPub = 1; //ok
pubObj.pPro = 1; //Error
pubObj.pPriv = 1; //Error
return 0;
}