基类和派生类

对象类型:静态类型和动态类型。静态类型是在编译时就已经知道的类型。动态类型是在内存中的对象,直到运行时才知道类型。
如果基类base中有虚函数,派生类sub继承基类,在初始化时:
1、通过类定义的基类对象,用派生类去初始化基类时,基类对象不会转化为派生类对象,即基类对象调用的函数还是自己内部写的;
2、通过指针,定义的基类对象,用派生类去初始化时,会将此基类对象转化为派生类对象,即调用的重载函数是派生类内部的函数,和基类的函数无关。即:基类的指针或引用可以绑定的派生类对象上,这也就对于工厂模式最好的利用。可以通过基类的调用,在程序运行中,根据不同的配置,去实例化不同的版本的对象。例如db2类和oracle类。
3、基类中有虚函数,对基类实例化对象以后,该对象仍能够调用该虚函数,且能执行。当使用基类的指针或引用时,调用一个虚函数会执行动态绑定,即直到运行时才知道调用了哪个版本的虚函数,所以所有的虚函数都必须有定义,不管是否用到,因为连编译器也无法确定到底会使用哪个虚函数;
4、记住:动态绑定只有当通过指针或引用调用虚函数时才会发生。当通过一个具有普通类型而非指针或引用,调用虚函数时,在编译时就会将调用的版本确定下来。
5、基类中的虚函数,则在其以后的所有派生类中都是虚函数。所以不必在派生类中还对重载的虚函数使用virtual。
代码如下:

#include
using namespace std;

class base
{
public:
    //base(int temp):s(temp){}
    void dog()
    {
        cout<<"dog"<virtual void animal()
    {
        cout<<"animal"<//int s;
};

class sub:public base
{
public:
    //sub(int temp):base(temp){}
    void animal() override
    {
        cout<<"my animal"<void our()
    {
        cout<<"our"<void main()
{
    /*sub sub1;
    base parent(sub1);
    parent.animal();//输出animal
    system("pause");*/
    base  *parent = new sub();
    parent->animal();//输出:my animal
    system("pause");
}

你可能感兴趣的:(C++基础)