通过运行虚函数来分段故障

时间:2018-02-03 21:06:22

标签: c++ segmentation-fault virtual

每次我运行我的代码。终端显示“段故障”。 (我是c ++的新手,所以也许你可以帮助我改进我的代码)我有一个名为“Animal”的基类和一个“Dog”和一个“Cat”类。我不想跑“doSmth”。在主要我创建了Cat *和Dog *两个指针。我使用CodeBlocks,我的操作系统是Ubuntu 16.04。

#include <iostream>

#ifndef ANIMAL_H
#define ANIMAL_H

class Cat;
class Dog;

class Animal
{
    public:
        Animal();
        virtual ~Animal();

        virtual void doSmth();

    protected:

    private:
};

#endif

#ifndef CAT_H
#define CAT_H

class Cat : public Animal
{
    public:
        Cat();
        virtual ~Cat();

        void doSmth()
        {
            std::cout << "Miau" << std::endl;
        }

    protected:

    private:
};

#endif

#ifndef DOG_H
#define DOG_H

class Dog : public Animal
{
    public:
        Dog();
        virtual ~Dog();

        void doSmth()
        {enter code here
            std::cout << "Wuff" << std::endl;
        }

    protected:

    private:

};

#endif

int main()
{
    Dog* d;
    Cat* c;

    d->doSmth();
    c->doSmth();

    return 0;
}

2 个答案:

答案 0 :(得分:3)

您遇到分段错误的原因是您没有为dc分配内存,并且正在尝试访问未初始化的数据。将两个声明行更改为:

Dog* d = new Dog{};
Cat* c = new Cat{};

new运算符为这两个类中的每一个分配内存,尽管它不是唯一的方法。另外作为推荐,我会避免在这里使用指针,因为你不需要它们。

另外,在覆盖虚拟功能时,应使用override关键字。 (在&gt; C ++ 11中)

答案 1 :(得分:0)

您需要在使用它们之前创建对象。

如果您没有通过指向基类的指针访问任何一个对象,那么使用虚方法毫无意义。因此,在这种情况下,您可能希望指针为Animal *

此外,由于您现在正在为对象分配内存,因此应使用delete[]将其释放。

Animal *d = new Dog;
Animal *c = new Cat;

d->doSmth();
c->doSmth();

delete[] c;
delete[] d;

您还必须实施Dog::Dog()Dog::~Dog()Cat::Cat()Cat::~Cat()Animal::Animal()Animal::~Animal()Animal::doSmth()如果你还没有。