Administrator
发布于 2023-11-19 / 5 阅读 / 0 评论 / 0 点赞

c++的多态的奇妙

c++的多态

#include <iostream>
#include <ostream>

using namespace std;

class Person{
public:
    virtual void dofun(int val=22){
        cout<<"Person=>" <<val <<endl;
    }
    virtual void callfun(){dofun();}
};

class Son:public Person{
public:
    virtual void dofun(int val=1){
        cout<<"Son=>" <<val <<endl;
    }
};

int main(int, char**){
    // std::cout << "Hello, from demo1!\n";
    Son * son= new Son();
    Person *p=son;
    son->callfun();
    p->callfun();
}

输出

Son=>22
Son=>22

解释,因为dofun()函数被重写,所以总是执行子类发实现,但是实际过程中,callfun先调用父类的dofun(),所以实际上默认参数已经变成22了,是有参数了,因此子类的val=1不生效

在C++中,当我们通过基类指针或引用调用一个函数时,如果该函数是虚函数,并且指针或引用指向的是派生类对象,那么将会调用派生类中的版本123。这就是所谓的动态绑定或运行时多态性。

在你的代码中,dofun函数在Person类中被声明为虚函数,然后在Son类中被重写。因此,无论你是通过Person类型的指针还是Son类型的指针调用callfun函数,最终调用的都是Son类中的dofun函数。

然而,你可能注意到输出的值是0,而不是你在Son::dofun函数中设置的默认值1。这是因为在Person::callfun函数中,dofun函数被直接调用,而没有参数传递,所以使用的是Person::dofun函数中的默认值0,而不是Son::dofun函数中的默认值1。

因此,输出结果Son=>0是符合预期的。希望这个解释能帮助你理解C++中虚函数的工作原理。如果你有其他问题,欢迎随时提问!


评论