一.派生的几种表示方式
struct Circle:Shape{/*...*/};
默认情况下,struct的成员都是公有的,基类中的公有成员也会成为结构体的公有成员,等价于这个表达:
class Circle:public Shape{public:/*..*/};
但是这样写是完全不同的:
class Circle:Shape{public:/*...*/};
这样写将使shape成为circle的私有基类,circle将不能访问shape的公有函数。
二.覆盖
当希望覆盖一个虚函数时,必须使用与基类完全相同的名字
struct B{
virtual void f() const {cout<<"B::f";}
void g() const { cout<<"B::g";} //not virtual
}
struct D:B{
void f() const {cout<<"D::f";} //overrides B::f
void g() {cout << "D::g";}
}
struct DD:D{
void g() {cout <<"DD:f";} //doesn't override D::f (not const)
void g() const {cout <<"DD:g";}
}
void call {const B& b}
//a D is a kind of B,so call() can accept a D
//a DD is a kind of D,so call() can accept a DD
{
b.f();
b.g();
}
int main()
{
B b;
D d;
DD dd;
call(b);
call(d);
call(dd);
b.f();
b.g();
d.f();
d.g();
dd.f();
dd.g();
}
将得到的结果:
B::f B::g D::f B::g D::f B::g B::f B::g D::f D::g DD::f DD::g