有没有什么C ++可以比D做得更好,或者D不能做什么? (多重继承的例子)

时间:2015-08-23 13:33:38

标签: c++ oop multiple-inheritance d

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

在我决定是否使用C ++或D之前(我已经了解C ++,我对D一无所知),我想知道C ++有什么比D更好的?如果您在线阅读D,那么有很多材料只是简单地说“这里是C ++代码的一个例子,这里是D代码中的代码示例 - 看起来好得多”。当然,对于所示的例子,这当然是正确的。

某些差异可能受到意见的影响。例如,从派生类调用基类构造函数是由super()(D)而不是<class name>(args)在初始化列表(After :表示法中)完成的。(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();
    }
}

但可能没有多重继承你不能这样做吗?

2 个答案:

答案 0 :(得分:4)

您的多继承问题可以使用模板mixin来解决,换句话说就是一段代码放入另一个代码中。例如:

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;
    }
}

我可以说,如果你的ReaderWriter有一个读者和一个作者的句柄而不依赖于过度耦合多重继承,你肯定会更好。

答案 1 :(得分:1)

两个月前我从C ++转到D,所以也许我错了。 ref限定符不替换C ++中的引用。特别是对于C ++ 11 rvalue引用和转发,你可以做很有效率的事情,比如只在必要时复制一个参数。 D我遇到问题的一个方面是引用和值类型。 C ++对此更加透明。 这使得编写有效代码变得困难。假设您有一些课程C!(T)。您可能想要创建T,但如果T是一个类,则需要T t = new T(arg),否则T t = T(arg)。我使用了mixin和T t = mixin((is (T == class) ? "new " : "") ~ "T(arg)");一样。这相当丑陋。在这种情况下,我更喜欢C ++值对象。