C++ 错误 pure virtual method called

C++ 错误 pure virtual method called
  • 某日做UnitTest(单元测试)时,Gtest跑完析构时,报出如下错误
.....
.....
.....
[ PASSED ] X tests.
pure virtual method called
terminate called without an active exception
Segmentation fault
  • 根据字面意思,就是调用了一个纯虚的函数。
  • 一般来讲,如果没有实现声明的纯虚函数。创建对象时,编译检查是不会通过的。例子如下:
#include <iostream>
class Parent
{ 
public:
    Parent()
    {
    }

    virtual ~Parent()
    {
    }

    virtual void crash() = 0;
    void init()
    {
    }
};

class Child : public Parent
{
public:
    Child()
    {
    }
};

int main()
{
    Child c;
    return 0;
}

  • 编译错误如下:
error: cannot declare variable ‘c’ to be of abstract type ‘Child’
Child c;
note: because the following virtual functions are pure within ‘Child’
class Child : public Parent
note: virtual void Parent::crash()
virtual void crash() = 0
  • 那么产生该问题的原因是?
  • 第一种:父类的构造函数中,调用了纯虚函数。
#include <iostream>

class Parent
{ 
public:
    Parent()
    {
        init();
    }

    virtual ~Parent()
    {
    }

    virtual void crash() = 0;
    void init()
    {
        // Call Pure Virtaul
        crash();
    }
};

class Child : public Parent
{
public:
    Child()
    {
    }

    void crash()
    {
        return ;
    }

};

int main()
{
    Child c;
    return 0;
}
  • 第二种:意外析构
#include <iostream>

class Parent { 
public:
    Parent()
    {
        std::cout << "Parent" << std::endl;
    }

    virtual ~Parent()
    {
        std::cout << "~Parent" << std::endl;
    }

    virtual void crash() = 0;
};
 
class Child : public Parent { 
public:
    Child()
    {
        std::cout << "Child" << std::endl;
    }

    virtual ~Child()
    {
        std::cout << "~Child" << std::endl;
    }

    void crash() {
        return ;
    }
};
 
int main()
{
    Child *p = new Child();
    p->~Child();
    p->crash();
    return 0;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
An unimplemented pure virtual method is a method in a C++ class that is declared as pure virtual, but not implemented in the class. A pure virtual method is a virtual function that does not have any implementation in the base class, and its implementation is provided by the derived class. When a pure virtual method is not implemented in a derived class, it remains unimplemented, and the derived class becomes an abstract class. An abstract class cannot be instantiated, and it should be used as a base class for other classes that provide the implementation for the pure virtual methods. If a class contains an unimplemented pure virtual method, the compiler will generate an error message, and the class cannot be instantiated. For example, consider a class called Shape that has a pure virtual method called area(): ``` class Shape { public: virtual double area() const = 0; // pure virtual method }; ``` If a derived class, such as Circle, does not provide an implementation for the area() method, it will become an abstract class: ``` class Circle : public Shape { public: // no implementation for area() method }; ``` The compiler will generate an error message because the Circle class is abstract and cannot be instantiated. To fix this error, the Circle class should provide an implementation for the area() method: ``` class Circle : public Shape { public: double area() const override { return 3.14 * radius * radius; } private: double radius; }; ``` Now the Circle class can be instantiated, and it provides its own implementation for the area() method.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值