C++ 抽象基类构造函数/析构函数 - 一般正确性

标签 c++ inheritance abstract-class virtual-inheritance

我想要一个 C++ Interface继承时必须覆盖(如果可能的话)。到目前为止,我有以下内容:

class ICommand{

public:
    //  Virtual constructor. Needs to take a name as parameter
    //virtual ICommand(char*) =0;
    //  Virtual destructor, prevents memory leaks by forcing clean up on derived classes?
    //virtual ~ICommand() =0; 
    virtual void CallMe() =0;
    virtual void CallMe2() =0;
};

class MyCommand : public ICommand
{
public:
    // Is this correct?
    MyCommand(char* Name) { /* do stuff */ }
    virtual void CallMe() {}
    virtual void CallMe2() {}
};

我故意留下了我认为构造函数/析构函数应该在 ICommand 中实现的方式。 .我知道如果我删除评论,它将无法编译。请问有人:

  1. 告诉我如何在 ICommand 中声明构造函数/析构函数以及它们在 MyCommand 中的用途
  2. 我在 ICommand 中的设置是否正确?这样MyCommand必须覆盖 CallMeCallMe2 .

最佳答案

C++ 不允许使用虚拟构造函数。一个简单的实现(没有虚拟构造函数)看起来像这样:

class ICommand {
public:
    virtual ~ICommand() = 0;
    virtual void callMe() = 0;
    virtual void callMe2() = 0;
};

ICommand::~ICommand() { } // all destructors must exist

请注意,即使是纯虚析构函数 must被定义。

一个具体的实现看起来和你的例子一模一样:

class MyCommand : public ICommand {
public:
    virtual void callMe() { }
    virtual void callMe2() { }
};

您有几个 options对于构造函数。一种选择是禁用 ICommand 的默认构造函数,这样子类将 实现调用 ICommand 构造函数的构造函数:

#include <string>

class ICommand {
private:
    const std::string name;
    ICommand();
public:
    ICommand(const std::string& name) : name(name) { }
    virtual ~ICommand() = 0;
    virtual void callMe() = 0;
    virtual void callMe2() = 0;
};

ICommand::~ICommand() { } // all destructors must exist

一个具体的实现现在看起来像这样:

class MyCommand : public ICommand {
public:
    MyCommand(const std::string& name) : ICommand(name) { }
    virtual void callMe() { }
    virtual void callMe2() { }
};

关于C++ 抽象基类构造函数/析构函数 - 一般正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513408/

相关文章:

.NET 抽象类

c++ - 使用可变参数模板函数在 lambda 中传递文字的正确引用时出现段错误

c++ - 在 Linux 上启用 OpenMPI

c++ - 无法创建类实例

c++ - 是否有可能从基类函数 "inherit"派生函数?

python - 实现 __contains__ 方法时从 collections.abc.Container 类隐式继承

C++ << 运算符重载和 Arduino 模板

c++ -/proc/fd 文件描述符显示什么?

C# 继承 : implements + extends

java - 抽象类中的具体方法