繁体   English   中英

C ++中的抽象类

[英]Abstract class in c++

假设我上课了:

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

而且,我不想创建此类的任何对象,但是我真的不想在此放置任何其他对象并将其变成纯虚拟fnc。 还有什么其他方法可以使此类抽象化,或者我必须创建虚拟的fnc并将其声明为纯虚拟的? 谢谢。

如果需要基类,则可能需要虚拟析构函数 使它成为纯虚拟的,您就拥有了抽象类。

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

添加纯虚拟析构函数。

使构造函数受保护:

class Bad_Date
{
private:
const char* _my_msg;

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

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

您可以使析构函数成为纯虚拟的,并使其成为您的“虚拟函数”。

 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子类只是充当Bad_Date的工厂。

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

您可以将构造函数 设为私有 保护,从而覆盖默认的构造函数:

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

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

也许您只能给该类一个私有的构造函数?

在IIRC中,抽象类之所以精确是因为它们至少具有一个纯虚函数。

使析构函数成为纯虚拟的(抽象的)-但请记住也为它提供一个实现,否则您将永远无法销毁从Bad_Date派生的对象:

class Bad_Date
{
    // ...

public:  // or maybe protected

    virtual ~Bad_Date() = 0;
};


Bad_Date::~Bad_Date()
{
}

许多人对也定义的纯虚函数的组合感到困惑,认为这没有任何意义。 但这不仅合法,而且在某些情况下是必需的(例如纯虚拟dtor)。

您还可以使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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM