重写与多态(重写的两个错误)

重写:1.在父子类中,子类重写父类函数    2.函数名同名  3.参数相同  4.父类的同名必须有virtual

重写是动态联编,根据或引用实际指向的对象决定调用哪个类的函数

多态:调用同名函数时,由于参数不同(重载)或由于所调用的对象(重写)不同造成调用结果不同

重载和重写的区别:1.范围不同  2.参数要求不一样(重载:参数不同 重写:参数必须一样)  3.virtual要求不同  4.重载是静态联编,重写是动态联编

重写的两种错误:

1.子类与父类函数名相同,参数相同,但是父类没有virtual,只能发生静态联编  //没有编译错误 但是达不到效果

2.子类与父类函数名相同,参数不同,都是静态联编

class Parent
{
public:

    Parent()
    {
        cout<<"Parent()"<<endl;
        this->privata_data =0;
    }
    Parent(int k)
    {
        this->privata_data =k;
    }

    virtual void show(int p) //加上virtual就是动态联编了
    {
        cout<<"Parent:show"<<this->privata_data<<endl;
    }
    void setPrivatadata(int a)
    {
        this->privata_data = a;
    }

int privata_data;
};

class Sub:public Parent
{
public:
    Sub()
    {
        cout<<"Sub()"<<endl;
        this->name = " ";
    }

    Sub(const string &name,int k=0):Parent(k)
    {
        cout<<"Sub(const string &name,int k=0):Parent(k"<<endl;
        this->name = name;
    }
    void show(string &name)
    {
        cout<<"Sub:show"<<this->name<<endl;
    }

    ~Sub()
    {
        cout<<"~Sub()"<<endl;
    }

private:
    string name;
};

void showData(Parent *p)
{
    p->show();
}
  
int main(int argc, char *argv[])
{
#if 1
    Parent *p = new Sub;//父类指针指向子类对象
    p->show();//静态联编,结果是调用父类的show函数
    delete p;
#endif
#if 1
    Parent *p = new Sub;
    p->show("xiaoli");  
    delete p;
#endif
}

参数不同,此时不管父类有没有virtual都会被屏蔽掉

原文地址:https://www.cnblogs.com/xiaozoui11cl/p/12767491.html