运行 虚函数的段错误

Segment fault by running virtual function

每次我运行我的代码。终端显示 "Segment fault"。 (我是 C++ 的新手,所以也许你可以帮助我改进我的代码)我有一个名为 "Animal" 的基础 class 和一个 "Dog" 和一个 "Cat" class.我不想 运行 "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;
}

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

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

new 运算符为这两个 类 中的每一个分配内存,尽管这不是唯一的方法。同样作为建议,我会避免在此处使用指针,因为您不需要它们。

附带说明一下,重写虚函数时,应该使用 override 关键字。 (在 >C++11 中)

您需要先创建对象才能使用它们。

如果您不是通过指向基 class 的指针访问任何一个对象,那么使用虚拟方法就没有意义。所以在这种情况下,你可能希望你的指针是 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() 如果你还没有的话。