由C++构成的抽象世界存在is a kind of 的关系
例如:
视频文件 VideoFile 是一种 File
MP4文件 MP4File 是一种视频文件 VideoFile
在C++里,由继承的语法来表示is lind of的关系
class File
{
}
class VideoFile : public File
{
}
语法:class B : public A{}
表示类B继承于类A,把A称为父类(基类),把B称为子类(派生类)
当B继承于A时,则自动地将父类中的所有public成员继承。
子类只需要把自己的独有的那部分特性写出来
在描述继承关系时,新增一种访问修饰符protected(受保护的)
当一个类成员被修饰为protected的时候,有以下规则成立:
(1)该成员不能被外部访问,同private
(2)给成员可以被子类继承,同public
所以,public和protected的成员都能够被子类继承
在内存上描述父类和子类的关系:子类对象的前半部分就是父类的对象。
父类的private成员变量也会在子类的对象中,只是编译器限制了访问。
子类可以重写从父类继承而来的函数
class Parent
{
public:
void Test();
}
class Chlid : public Parent
{
public:
void Test();
}
重写函数的时候,可以调用父类的函数,然后加上自己要写的内容
void Child::Test()
{
Parent::Test();//显示地调用父类的函数
]
将父类的指针指向子类的对象,这样是完全允许的,从语法本质上将,子类对象的前半部就是父类,因而可以将子类对象的指针直接转化为父类。
例:
int main()
{
Child ch;
ch.a=0x11111111;
ch.b=0x22222222;
Parent * p = &ch;
printf("Parent::a=%d\n",p->a);
return 0;
}
将父类的指针指向子类的对象如果有重写的函数时,指针指向的是父类的函数。
例:Test为重写过的函数
Parent * p = new Child();
p->Test();
此时p指向的是父类的Test();
当一个成员函数需要子类重写,那么在父类应该将其声明为virtual。(有时将声明为virtual的函数称为虚函数)。
例如:
class Parent
{
public:
virtual void Test();
};
virtual本身表明该函数即将被子类重写
例:
Parent * p = new Child();
p->Test();
如果Test()在父类中被声明为virtual,是调用的是子类的Test();
virtual的作用:根据对象的实际类型,调用相应类型的函数。
注意:
(1)只需要在父类中将函数声明为virtual,子类自动地就是virtual了。
(2)即将被重写的函数添加virtual,是一条应该遵守的编码习惯。
(3)构造函数不能加virtual
例如:
视频文件 VideoFile 是一种 File
MP4文件 MP4File 是一种视频文件 VideoFile
在C++里,由继承的语法来表示is lind of的关系
class File
{
}
class VideoFile : public File
{
}
语法:class B : public A{}
表示类B继承于类A,把A称为父类(基类),把B称为子类(派生类)
当B继承于A时,则自动地将父类中的所有public成员继承。
子类只需要把自己的独有的那部分特性写出来
在描述继承关系时,新增一种访问修饰符protected(受保护的)
当一个类成员被修饰为protected的时候,有以下规则成立:
(1)该成员不能被外部访问,同private
(2)给成员可以被子类继承,同public
所以,public和protected的成员都能够被子类继承
在内存上描述父类和子类的关系:子类对象的前半部分就是父类的对象。
父类的private成员变量也会在子类的对象中,只是编译器限制了访问。
子类可以重写从父类继承而来的函数
class Parent
{
public:
void Test();
}
class Chlid : public Parent
{
public:
void Test();
}
重写函数的时候,可以调用父类的函数,然后加上自己要写的内容
void Child::Test()
{
Parent::Test();//显示地调用父类的函数
]
将父类的指针指向子类的对象,这样是完全允许的,从语法本质上将,子类对象的前半部就是父类,因而可以将子类对象的指针直接转化为父类。
例:
int main()
{
Child ch;
ch.a=0x11111111;
ch.b=0x22222222;
Parent * p = &ch;
printf("Parent::a=%d\n",p->a);
return 0;
}
将父类的指针指向子类的对象如果有重写的函数时,指针指向的是父类的函数。
例:Test为重写过的函数
Parent * p = new Child();
p->Test();
此时p指向的是父类的Test();
当一个成员函数需要子类重写,那么在父类应该将其声明为virtual。(有时将声明为virtual的函数称为虚函数)。
例如:
class Parent
{
public:
virtual void Test();
};
virtual本身表明该函数即将被子类重写
例:
Parent * p = new Child();
p->Test();
如果Test()在父类中被声明为virtual,是调用的是子类的Test();
virtual的作用:根据对象的实际类型,调用相应类型的函数。
注意:
(1)只需要在父类中将函数声明为virtual,子类自动地就是virtual了。
(2)即将被重写的函数添加virtual,是一条应该遵守的编码习惯。
(3)构造函数不能加virtual