运行 虚函数的段错误
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;
}
您遇到分段错误的原因是您没有为 d
或 c
分配内存,并且正在尝试访问未初始化的数据。将两个声明行更改为:
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()
如果你还没有的话。
每次我运行我的代码。终端显示 "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;
}
您遇到分段错误的原因是您没有为 d
或 c
分配内存,并且正在尝试访问未初始化的数据。将两个声明行更改为:
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()
如果你还没有的话。