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