什么人在这里使用C++抽象的基类的构造为在现场吗?我谈论的纯粹的接口类没有数据成员和没有非纯粹的虚拟的成员。

任何人都可以证明的任何语使用ABC造一个有用的办法?还是只是固有的性质,使用自动边防系统实现接口,他们仍是空的,内并受到保护?

有帮助吗?

解决方案

任何人都可以证明的任何语使用ABC造一个有用的办法?

这里有一个例子,虽然这是一个人为的,罕见的例子。

你可能会用它来保持一个列表中的所有实例:

class IFoo
{
private:
  //static members to keep a list of all constructed instances
  typedef std::set<IFoo*> Set;
  static Set s_set;

protected:
  //new instance being created
  IFoo()
  {
    s_set.insert(this);
  }

public:
  //instance being destroyed
  virtual ~IFoo()
  {
    s_set.remove(this);
  }

  ... plus some other static method and/or property
      which accesses the set of all instances ...
};

还是只是固有的性质,使用自动边防系统实现接口,他们仍是空的,内并受到保护?

更通常他们只是不声明的。没有理由宣布他们:

  • 空和内联=>为什么还要声明?
  • 保护=>ABC可能已经有一些 纯粹的虚拟 方法,并因此已经不可能实例,除了作为一个亚类。

其他提示

假设有一些行为,是共同所有衍生课程。例如登记本身在一些外部注册或检查有效性的东西。

所有这一共同的代码可以被安置在基类的构造,以及它会被称为隐含从建设的各个源类别。

如何 可能 一个抽象的基类的构造以用于什么?

假设你有一个抽象的基B类和源类D.当一个对象D类型的创建、B的构造是所谓第一,但在这一点上,对象"是"还是B型(见 在这里,)--尤其是,调用任何虚拟的职能从身体的构造将呼叫 B自己的实现 这些职能。但如果B是一个纯粹的抽象类,没有这些虚拟的功能定义,这样的程序会立即崩溃。

我猜你打算用于B的构造叫下来的大多数来源级的(例如D)实施一个虚拟的功能,对吗?这将是一个糟糕的想法一般是因为德的对象是没有完全构成的,所以任何访问成员变量在D从内部D的执行情况的虚拟功能将访问未初始化记忆。

请记住: "资源获取被初始化".

有时候,我们使用抽象的基类作为某种形式的锁定机构。例如,在一个多线程的环境,那里几个线程需要共享一个单一的资源,那么一个线程可以使用的构造作为一种方式获得资源,析构释放资源

void PlayWithPaintBallGun(Target &target)
{
    PaintBallGun paintBallGun;    // constructor waits until the gun is free,
                                  // then picks it up.

    paintBallGun.Aim(target);     // Shoot something
    paintBallGun.Fire();          //

                                  // Clever! The destructor is automatically
                                  // called when it goes out of scope. So we
                                  // can't forget to put the gun down.
}

Hugo

我不能想想许多有用的例子。一类无数据-的成员已经没有一个国家因而不能初始化的任何东西。你可以拥有的构造/析构做记录你,虽然。例如,日志建立/销毁的所有访问对象:

class Visitor {
public:
    Visitor() {
        std::cout << "Visitor@" << this << " created" 
                  << std::endl;
    }

    virtual ~Visitor() {
        std::cout << "Visitor@" << this << " destroyed" 
                  << std::endl;
    }

    virtual void visitA(A*) = 0;
    virtual void visitB(B*) = 0;
    // ...
};

通常它只是为初始化各成员以合理的价值观。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top