我正在学习虚函数和抽象类,似乎我很难理解某些东西。假设我有以下代码:
class animal {
public:
virtual void show()=0;
};
class dog : public animal {
int weight;
};
int main()
{
//animal a;
dog d;
return 0;
};
由于动物类是抽象类,并且我不可以声明该类的对象,所以我理解动物a是不正确的。但是,为什么狗d也不正确? (假设class狗不是抽象的,所以我可以声明dog对象)
提前谢谢!
答案 0 :(得分:1)
派生类Dog
也是一个抽象类,因为纯虚函数show
不会被覆盖。因此,类Dog
具有相同的纯虚函数。
请注意,如果您需要多态性,则必须将基类的析构函数声明为virtual。
至少你可以写
class animal {
public:
virtual ~animal() = default;
virtual void show()=0;
};
答案 1 :(得分:0)
这里缺少的重要概念是抽象类animal
具有所谓的纯虚函数,在您的情况下为
virtual void show()=0;
通常,覆盖虚拟功能是可选的。在您的情况下,由于已通过在末尾添加=0
来将虚拟函数声明为 pure ,因此C ++编译器要求您在从{继承的所有类中重写show()
{1}},例如animal
。
要使您的dog
类不抽象并且与dog
接口兼容,请在animal
中为show()
添加一个函数定义,以便编译器可以成功链接其父级的纯虚函数。看起来像这样:
dog