虚拟函数c++

Virtual Function c++

本文关键字:c++ 函数 虚拟      更新时间:2023-10-16

嗨,我有一个关于c++虚拟函数的问题。。。

class base{
 public :
    base()  { a=5;}
    int a;
    virtual void print()=0;
    int get(){return a;}
    int get_var(){ a=5;  return a;}
};  
int main(void){
    base *p;
    cout <<"Get Call - No assignn";
    cout <<"Value is :: "<<p->get()<<endl;
    cout <<"Get Call - assign valuen";
    cout <<"Value is :: "<<p->get_var()<<endl;
    return 0;
}

其o/p为:获取呼叫-无分配值为::5分段故障

我不理解这种行为
我能想到的一个原因是,因为基类是抽象类,即没有完整的实现,所以当我做a=5时,它会崩溃
但在第一次通话中,我也使用了一个所以为什么它没有在那里崩溃
请帮忙。。。。

根本原因:

您的指针p没有指向任何有效对象,因此当您通过调用其上的成员函数来取消围栏时,会发生崩溃(实际上它是一个未定义的行为)。

当你声明一个指针只指向任何随机地址时,你的责任是让它指向一个有效的对象,以便能够用指针做任何有意义的事情。

解决方案:

您需要:

base *p = new base; 

base obj;
base *p = &obj;

为了使上述任何一个工作,base必须是非抽象类。在您的示例中,base是一个抽象类(至少有一个纯虚拟函数的),对于这样的类,您不能创建它的任何对象(调用其构造函数
因此,为了解决这个问题,您需要创建一个从抽象类base派生的派生类,然后为派生类实现纯虚拟函数print(),从而使派生类成为一个具体类,而不是抽象类。然后你可以查看工作中的动态调度(我猜这是你的目标

class Derived:public base
{
    public:
        virtual void print()
        {
            //Do some prints
        }
};
int main()
{
    Derived obj;
    Base *ptr = &obj;
    //or
    Base *ptr2 = new Derived;
    //.....Rest of your program as is
}

您没有初始化base *p;,因此对其调用方法是Undefined Behavior(在您的情况下是segfault)。

另一方面,由于base是一个抽象类,因此无法对其进行初始化。必须在base或派生类中提供print的定义。

我能想到的一个原因是,因为基类是抽象类,即没有完整的实现,所以当我做a=5时,它会崩溃。

不,崩溃是由取消引用统一指针p(技术上未定义的行为)引起的。由于base是抽象的,因此无法创建它的实例:

base b;             // Illegal
base* p = new base; // Illegal 

并且在发布的代码中没有派生的具体类。您需要从base派生并实现纯虚拟函数print()base类中的析构函数也应该是virtual

p是一个未初始化的指针。因此,用它做任何事情都是未定义的行为。

"为什么它没有早点崩溃"的答案通常是"运气"(好或坏,取决于你的观点)。具有Undefined Behavior的程序可以做任何事情:看起来工作、崩溃、让鼠标爆炸等等。