当基础 class 是抽象时,声明一个 subclass 的对象
Declaring an object of a subclass when the base class is abstract
我正在学习虚函数和抽象classes,似乎我在理解某些东西时遇到了困难。假设我有这段代码:
class animal {
public:
virtual void show()=0;
};
class dog : public animal {
int weight;
};
int main()
{
//animal a;
dog d;
return 0;
};
我明白动物 a 是多么不正确,因为动物 class 是抽象的,我不能声明这个 class 的对象。但是,为什么dog d也不对呢? (假设 class dog 不是抽象的,所以我可以声明 dog 对象)
提前致谢!!
派生的classDog
也是一个抽象class,因为纯虚函数show
没有被覆盖。所以 class Dog
具有相同的纯虚函数。
请注意,如果您需要多态性,则必须将基础 class 的析构函数声明为虚拟。
至少你会写
class animal {
public:
virtual ~animal() = default;
virtual void show()=0;
};
您在这里缺少的重要概念是您的抽象 class、animal
具有所谓的 纯虚函数,它在你的情况是
virtual void show()=0;
通常,覆盖虚函数是可选的。在您的情况下,因为您通过在末尾添加 =0
将虚函数声明为 pure,C++ 编译器要求您在所有 class继承自animal
的es,例如dog
.
为了让你的 dog
class 非抽象并符合你的 animal
接口,在 dog
中添加 show()
的函数定义,所以编译器可以成功 link 其父级的纯虚函数。那看起来像这样:
class dog : public animal {
inline void show()
{ //something here
return;
};
int weight;
};
我正在学习虚函数和抽象classes,似乎我在理解某些东西时遇到了困难。假设我有这段代码:
class animal {
public:
virtual void show()=0;
};
class dog : public animal {
int weight;
};
int main()
{
//animal a;
dog d;
return 0;
};
我明白动物 a 是多么不正确,因为动物 class 是抽象的,我不能声明这个 class 的对象。但是,为什么dog d也不对呢? (假设 class dog 不是抽象的,所以我可以声明 dog 对象)
提前致谢!!
派生的classDog
也是一个抽象class,因为纯虚函数show
没有被覆盖。所以 class Dog
具有相同的纯虚函数。
请注意,如果您需要多态性,则必须将基础 class 的析构函数声明为虚拟。
至少你会写
class animal {
public:
virtual ~animal() = default;
virtual void show()=0;
};
您在这里缺少的重要概念是您的抽象 class、animal
具有所谓的 纯虚函数,它在你的情况是
virtual void show()=0;
通常,覆盖虚函数是可选的。在您的情况下,因为您通过在末尾添加 =0
将虚函数声明为 pure,C++ 编译器要求您在所有 class继承自animal
的es,例如dog
.
为了让你的 dog
class 非抽象并符合你的 animal
接口,在 dog
中添加 show()
的函数定义,所以编译器可以成功 link 其父级的纯虚函数。那看起来像这样:
class dog : public animal {
inline void show()
{ //something here
return;
};
int weight;
};