有什么事情是 C++ 可以比 D 做得更好,或者是 D 做不到的吗?(多重继承的例子)

use*_*501 3 c++ oop d multiple-inheritance

最近我对学习D编程语言产生了兴趣。(特别是 D2,在撰写本文时,人们所指的就是 D2,因为原始 D 现在处于维护模式,以与现有代码兼容。)

在我决定使用C++还是D之前(我已经了解C++,我对D一无所知),我想知道C++有什么比D更好的地方吗?如果您在线阅读有关 D 的内容,有很多材料只是简单地说“这是 C++ 代码的示例,这是 D 代码的示例,看看 - 它恰好要好得多”。对于所示的示例来说当然是正确的。

有些差异可能需要征求意见。例如,从派生类调用基类构造函数是由super()(D) 完成的,而不是<class name>(args)在初始化列表中(在:符号之后。)(C++)。我个人不喜欢这个,super但这只是我的意见,这不是要问的问题。

更相关的是D不能支持多重继承。(!)

  • 还有什么是 D 不支持而 C++ 支持的?
  • 是否有一些例子说明 C++ 由于某些语法或逻辑原因而在 D 中做得更好?(主要不是基于意见,但如果相关且有建设性,请随意回应基于意见的论点。)
  • D 不支持多重继承这一事实是否会导致您“无法”执行在 C++ 中可以执行的操作?(我在想也许iostream//ifstream操作ofstream?)
  • 如果您确实需要的话,有办法绕过多重继承禁令吗?

例如,您可能想要在 C++ 中做的一件事如下所示:

class base
{

}

class base_has_read_operation
{
    public:
    void read()
    {
        // complicated read function, 100000 lines of code...
    }

    virtual void do_read() = 0;

    private;
    // data
}

class base_has_write_operation
{
    public:
    void write()
    {
        // complicated write function, 100000 lines of code
    }

    virtual void do_write() = 0;

    private:
    // data
}

class reader : public base_has_read_operation
{
    public:
    void do_read()
    {
        read();
    }
}

class writer : public base_has_write_operation
{
    public:
    void do_write()
    {
        write();
    }
}

class read_writer : public base_has_read_operation, base_has_write_operation
{
    public:
    void do_read()
    {
        read();
    }

    void do_write()
    {
        write();
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果没有多重继承,你可能无法做到这一点?

cym*_*m13 5

您的多继承问题可以使用模板混合来解决,换句话说,将一段代码嵌入到另一段代码中。例子:

interface IWriter {
    void do_write();
}

// It is a template, you can specify compile-time arguments
mixin template Write() {
    // complicated write function
}

interface IReader {
    void do_read();
}

mixin template Read() {
    // complicated read function
}

// D has multiple interface inheritance
class ReaderWriter : IWriter, IReader {
    void do_write {
                      // You can do other things before...
        mixin Write;  // The code of Write is inserted here
                      // ...or after
    }

    void do_read {
        mixin Read;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以说,如果您的 ReaderWriter 拥有读取器和写入器的句柄,而不是依赖于过度耦合的多重继承,那么您的情况肯定会更好。