抽象类的使用

题目描述

在面向对象编程中,某些类的定义只希望作为“抽象”的概念,不希望定义出具体的对象。抽象类经常作为一个一般性概念而存在,它会包含若干个具体的派生类作为这个一般性概念的具体解释。抽象类的纯虚函数则作为一个约束,要求其派生类必须实现这些纯虚函数的定义。

完善下列代码,即完善抽象类 Animal 类的定义,使得程序行为符合定义。

关于输入

关于输出

见样例输出

核心技巧

  • 含有纯虚函数的类为抽象类,无法定义具体对象。
  • 含有虚函数的类一般都应当声明虚析构函数。

参考答案

#include <iostream>
#include <type_traits>
using std::cout, std::endl;
class Animal {
public:
    Animal() = default;
    virtual void speak() = 0;
    virtual ~Animal() = default;
};
class Dog : public Animal {
public:
    void speak() override { cout << "Bark!" << endl; }
};
class Cat : public Animal {
public:
    void speak() override { cout << "Meow!" << endl; }
};

// 这是一些黑魔法代码,你不用管
template<typename,typename>struct J:
std::true_type{};template<typename T
>struct J<T,std::void_t<decltype(T()
)>>:std::false_type{};static_assert(
J<Animal,void>::value);static_assert
(std::has_virtual_destructor<Animal>
::value);

int main(){
    Dog d;
    Cat c;
    // Animal a;  //报错
    Animal* a[2]{&d, &c};
    for (int i = 0; i < 2; i++) {
        a[i]->speak();
    }
    return 0;
}