c ++中的抽象类

时间:2009-11-15 19:34:22

标签: c++ polymorphism abstract-class

让我说我上课了:

class Bad_Date
{
private:
const char* _my_msg;
public:
const char* msg() const
{
return _my_msg;
}
};

我希望无法创建此类的任何对象,但我真的不想在其中放置任何其他内容并使其成为纯虚拟fnc。有没有其他方法可以使这个类抽象或我必须创建虚拟fnc并将其声明为纯虚拟? 谢谢。

9 个答案:

答案 0 :(得分:10)

如果您需要基类,则可能需要虚拟析构函数。让它变成纯粹的虚拟,你就得到了抽象的类。

如果您不需要虚拟析构函数(即该类未以多态方式使用),则可以使构造函数受保护(非私有)。

答案 1 :(得分:7)

添加纯虚析构函数。

答案 2 :(得分:7)

使构造函数受到保护:

class Bad_Date
{
private:
const char* _my_msg;

// Add the 2 lines below:
protected:
    Bad_Date() {}

public:
const char* msg() const
{
return _my_msg;
}
};

答案 3 :(得分:3)

你可以使析构函数变为虚拟,并将其作为你的“虚函数”。即。

 class Bad_Date
 {
   private:
   const char* _my_msg;
   public:
   const char* msg() const { return _my_msg; }
   virtual ~Bad_Date() = 0;
 };

对于您打算使用多态的任何类,无论如何使析构函数虚拟是一个好主意,以确保子类实例得到适当的清理。如果你需要Bad_Date在析构函数中做一些工作,你当然不能使析构函数成为虚拟的。使Bad_Date的构造函数受到保护是另一种可行的技术。这将确保Bad_Date只能由Bad_Date的子类构造。不幸的是,这不会阻止有人创建Bad_Date子类只是作为Bad_Date的工厂。

除此之外,还有用于创建抽象基类的编译器特定扩展,例如MSVC有__interface,gcc 曾经有signature

答案 4 :(得分:1)

您可以使构造函数 private 受保护,从而覆盖默认构造函数:

class Bad_Date
{
    protected:
    Bad_Date() { }
    // rest of the class definition
};

答案 5 :(得分:0)

我的C ++生锈了,但仍然:

也许你只能给这个类一个私有构造函数?

IIRC,抽象类是抽象的,因为它们至少有一个纯虚函数...

答案 6 :(得分:0)

使析构函数变为纯虚拟(抽象) - 但是记住也给它一个实现,否则你将永远无法破坏从Bad_Date派生的对象:

class Bad_Date
{
    // ...

public:  // or maybe protected

    virtual ~Bad_Date() = 0;
};


Bad_Date::~Bad_Date()
{
}

许多人对纯虚拟功能的组合感到困惑,这些功能也被定义,认为它没有意义。但这不仅是合法的,在某些情况下也是必需的(比如纯虚拟的dtor)。

答案 7 :(得分:0)

你也可以制作msg(),纯虚拟,同时也提供它的实现。

class Bad_Date
{
private:
const char* _my_msg;
public:
virtual const char* msg() const = 0;
};

const char* Bad_Date::msg() const {
    return _my_msg;
}

答案 8 :(得分:0)

您应该阅读this以避免使用纯虚拟析构函数的常见陷阱。