具有两个构造函数的抽象类

Abstract class with two constructors c++

本文关键字:两个 构造函数 抽象类      更新时间:2023-10-16

假设我有以下两个构造函数的抽象类:

#ifndef ABSTRACTCLASS_H
#define ABSTRACTCLASS_H
#include <iostream>
using namespace std;
class AbstractClass
{
    public:
      AbstractClass(int);
      AbstractClass();
      virtual ~AbstractContext();
      //Pure virtual function
      virtual void doSomething() = 0;
    private:
        int  x;
};
#endif 

我有两个类,将继承从AbstractClass

  1. A类将使用AbstractClass(int);
  2. B类将使用AbstractClass();

#ifndef A_H
#define A_H
class A: public AbstractClass
{
    public:
     A(int = 0);
     virtual ~A();
     virtual void doSomething();
    private:
     int xCoord;
}
#endif
A.cpp
#include "A.H"
A::A(int x):AbstractClass(x),xCoord(x) {}
void A::doSomething()
{
  cout << xCoord * xCoord << endl;
}

#ifndef B_H
#define B_H
        
    class B: public AbstractClass
    {
        public:
         B();
         virtual ~B();
         virtual void doSomething();
    }
    
    #endif
    B.cpp
    #include "B.H"
    B::B():AbstractClass() {}
    
    void B::doSomething()
    {
      cout << "nothing" << endl;
    }

<标题>
  • 我使用2个构造函数在一个抽象类的好做法?
  • 继承正确吗?特别是我使用了两个版本的构造函数?

拥有一个以上public构造函数的ABC是完全合适的,如果这两个构造函数都可以应用于从ABC派生(或将来有一天)的每个类型。

也就是说,public基类构造函数仍然是该类接口的一部分。如果这些构造函数中的一个或多个不适用于每个具体实例化,那么理想情况下它们不应该是public接口的一部分。将这些特殊的构造函数设置为private是一种改进,因为它使未来的程序员更难以错误地实现新的具体派生类型。

这是其他创造模式发挥作用的时候。一种常见而简单的方法是在ABC上提供static成员函数来创建具体类型。这是一个工厂方法模式的例子。

class A;
class B;
class AbstractClass 
{
public:
  static std::unique_ptr <AbstractClass> MakeA (int x)
  { 
    return std::make_unique <A> (x);  // You need to provide this, easily found
  }
  static std::unique_ptr <AbstractClass> MakeB ()
  {
    return std::m,ake_unique <B> ();
  }
  virtual ~AbstractClass();
private:
  AbstractClass ();
  AbstractClass (int x);
};

还有许多其他的创作模式;这是我最直观的感觉。

这没什么问题。

基类有两种初始化自身的方法,派生类使用最适合其实现的方法。同样地,它们可以选择提供两个自己的构造函数,映射到基类中的构造函数。

关键是两个构造函数都应该使类处于可感知的状态。因此,例如,您在基类中的默认构造函数可能应该将xCoord设置为一些合理的值(可能为0),而我猜测AbstractClass(int)xCoord设置为传递给构造函数的值。