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

Stu*_*ler 16 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() {}
};
Run Code Online (Sandbox Code Playgroud)

我故意离开了我认为应该实现构造函数/析构函数的方式ICommand.我知道如果删除注释,它将无法编译.请有人可以:

  1. 演示如何声明构造函数/析构函数ICommand以及如何使用它们MyCommand
  2. 我是否正确设置,ICommand以便MyCommand必须覆盖CallMeCallMe2.

我希望我没有错过任何非常简单的事情......

e.J*_*mes 24

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

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

ICommand::~ICommand() { } // all destructors must exist
Run Code Online (Sandbox Code Playgroud)

请注意,即使是纯虚拟析构函数也必须定义.

具体实现看起来与您的示例完全相同:

class MyCommand : public ICommand {
public:
    virtual void callMe() { }
    virtual void callMe2() { }
};
Run Code Online (Sandbox Code Playgroud)

你有几个构造函数的选项.一个选项是禁用默认构造函数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
Run Code Online (Sandbox Code Playgroud)

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

class MyCommand : public ICommand {
public:
    MyCommand(const std::string& name) : ICommand(name) { }
    virtual void callMe() { }
    virtual void callMe2() { }
};
Run Code Online (Sandbox Code Playgroud)

  • “ C ++不允许使用虚拟构造函数”我不确定这是正确的措辞。如果某种语言实现了虚拟构造函数,它甚至意味着什么?(请注意,我在说的是实际的构造函数,而不是类似构造函数的函数,并且仅指静态语言。) (2认同)