C++ 抽象类 : constructor yes or no?

标签 c++ class constructor abstract

具有一个(或多个)虚纯函数的类是抽象的,不能用于创建新对象,因此它没有构造函数。

我正在阅读一本提供以下示例的书:

class Employee {
   public:
       Employee(const char*, const char*);
       ~Employee();
       const char* getFirstName() const;
       const char* getLastName() const;


       virtual double earnings() const=0  // pure virtual => abstract class
       virtual void print() const

  private:
       char* firstName, lastName;
};

如果类是抽象的,为什么我们有一个构造函数?它稍后会使用这个类(Boss 是从 Employee 派生的公共(public)的):

void Boss::Boss (const char* first, const char* last, double s)
     : Employee (first, last)

最佳答案

当您说具有纯虚函数的类是抽象的并且不能被实例化时,您是对的。但是当你说它不能有构造函数时你就错了。

确实,正如您的示例所示,抽象类可以具有私有(private)成员,这些成员可以被此类的成员函数使用。并且这些成员必须被初始化。构造函数是一种方法(例如,在派生类中使用初始化列表,如您的第二个示例所示),在我看来比 init() 函数更好。

在答案中编辑我的评论:抽象类可以具有成员变量和潜在的非虚拟成员函数,因此从前者派生的每个派生类都实现特定功能。

那么,初始化这些成员变量的责任可能属于抽象类(至少总是私有(private)成员,因为派生类不能初始化它们,但可以使用一些可能使用/依赖这些成员的继承成员函数)。因此,抽象类实现构造函数是完全合理的。

关于C++ 抽象类 : constructor yes or no?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808667/

相关文章:

c++ - 初级 C++ 类型混淆

c++ - C++ 与 Java 中的构造函数和变量名称

以枚举值作为参数的 Javascript 构造函数

c++ - 尝试编译 OpenCV 程序,但在 Visual Studio 2012 中出现 LNK2038 错误

C++ 传递对象的速度有多快?

c++ - 伪随机数生成器给出相同的第一个输出,但随后按预期运行

c++ - uint64_t 如何存储负数? - 是不是意味着没有签名

c++ - 指向类成员函数的指针

Jquery在包含html字符串的变量中添加类

scala - 当从案例类外部查询时,为什么 getClass 在案例类构造函数参数上返回不同的值?