Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个多重继承的例子在C++;?_C++_Multiple Inheritance - Fatal编程技术网

C++ 这个多重继承的例子在C++;?

C++ 这个多重继承的例子在C++;?,c++,multiple-inheritance,C++,Multiple Inheritance,我有两门(不相关的)课。第一个是“点”: typedef std::复数; 类点 { 公众: 点(常数复数和词缀); 常量复数&get\u词缀()常量; 无效集粘贴(常量复数和新粘贴); //等 私人: 复数词缀; }; (顺便说一句,很抱歉问了这个不相关的问题,但是我的类型定义应该放在哪里?这里是我的point.hpp文件“good practice”的顶部吗?) 第二个是“Abstract_Vertex”(这是后面抽象图的一部分): typedef int-vertex_标签; 类抽象顶点

我有两门(不相关的)课。第一个是“点”:

typedef std::复数;
类点
{
公众:
点(常数复数和词缀);
常量复数&get\u词缀()常量;
无效集粘贴(常量复数和新粘贴);
//等
私人:
复数词缀;
};
(顺便说一句,很抱歉问了这个不相关的问题,但是我的类型定义应该放在哪里?这里是我的point.hpp文件“good practice”的顶部吗?)

第二个是“Abstract_Vertex”(这是后面抽象图的一部分):

typedef int-vertex_标签;
类抽象顶点
{
公众:
抽象顶点(常量顶点标签和标签);
const vertex_label&get_label()const;
常量顶点标签和获取邻居标签(常量int和索引)常量;
void set_标签(const vertex_标签和new_标签);
布尔是邻域标签(常数顶点标签和标签)常数;
//等
受保护的:
顶点标签;
std::向量邻居标签;
};
现在我想创建第三个类,“Plane_Vertex”(位于平面某处的顶点)。我正在考虑两种方法:

  • 多重继承:Plane_Vertex类同时从Point和Vertex继承,并且没有任何成员

  • Plane_Vertex类仅继承自Vertex,并具有一个私有的
    Point
    成员

  • 当然,我可以轻松避免多重继承,只需选择2。但是我是一个很好的认真学习的C++学习者,我想知道在我的情况下,什么是“好的实践”。
    谢谢你的见解

    通常情况下,除非你有充分的理由进行多重继承,否则要避免多重继承

    原因:

  • 你要避免这种情况
  • 让设计尽可能简单——经过几层之后,多重继承确实是一件很难遵循和维护的事情
  • 在不使用多重继承时,通常更容易检查类是否满足良好设计原则
  • 和/或通常提供良好或更好的方法
  • 测试你的课程更容易
  • 这些应该足以让你开始。Jon Cage链接到的帖子中有更多的智慧


    因此,回答您的问题:看起来您没有足够的理由使用多重继承。使用组合。通常,除非您有充分的理由进行多重继承,否则请避免使用组合

    原因:

  • 你要避免这种情况
  • 让设计尽可能简单——经过几层之后,多重继承确实是一件很难遵循和维护的事情
  • 在不使用多重继承时,通常更容易检查类是否满足良好设计原则
  • 和/或通常提供良好或更好的方法
  • 测试你的课程更容易
  • 这些应该足以让你开始。Jon Cage链接到的帖子中有更多的智慧


    因此,回答您的问题:看起来您没有足够的理由使用多重继承。使用合成。可能还有第三种选择。您可以像标准库一样,将
    AbstractVertex
    作为模板。然后,您可以在模板中实现图形导航和通用功能,并让用户提供要作为模板参数存储在节点中的值

    因为设计是折衷的,我将从我的角度指出主要的区别

    相关/不相关的顶点类型

    在模板方法中,不同的实例化是完全不同的类型。这意味着
    顶点
    顶点
    不相关。另一方面,在多态方法中,在所有顶点之上
    IntVertex
    PointVertex
    。。。是
    AbstractVertex
    对象:您可以将它们组合在容器中并连接它们,或者在可以使用
    AbstractVertex
    的代码中互换使用它们。这是两种方法的局限性还是优势,同样是一种设计决策。我更喜欢不相关的类型,因为我觉得不应该混合这些类型

    要编写的代码量

    在模板方法中,实现模板,然后实例化,在多态方法中,需要为要包含在图中的每个可能元素提供一个新类


    如果最终决定采用多态方法(我不会),那么我将避免使用这两种类型的多重继承,而更喜欢组合。一般来说,继承可能是面向对象语言中被滥用最多的特性,它可以用来解决许多问题,有时它似乎是所有问题的最简单解决方案,但事实并非如此。特别是,两种基本类型似乎都不是为继承而设计的,没有派生类型可以覆盖的功能,也没有虚拟函数。这些都清楚地表明,您正在滥用组合足够的继承。

    可能还有第三种选择。您可以像标准库一样,将
    AbstractVertex
    作为模板。然后,您可以在模板中实现图形导航和通用功能,并让用户提供要作为模板参数存储在节点中的值

    因为设计是折衷的,我将从我的角度指出主要的区别

    相关/不相关的顶点类型

    在模板方法中,不同的实例化是完全不同的类型。这意味着
    顶点
    顶点
    不相关。另一方面,在多态方法中,在所有顶点之上
    IntVertex
    PointVertex
    。。。是
    AbstractVertex
    对象:您可以将它们组合在容器中并连接
    typedef std::complex<double> complex_number;
    
    class Point
    {
    public:
        Point(const complex_number &affix);
    
        const complex_number & get_affix() const;
        void set_affix(const complex_number & new_affix);
    
        // etc
    private:
        complex_number affix_;
    };
    
    typedef int vertex_label;
    
    class Abstract_Vertex
    {
    public:
        Abstract_Vertex(const vertex_label &label);
    
        const vertex_label & get_label() const;
        const vertex_label & get_neighbor_label(const int &index) const;
        void set_label(const vertex_label &new_label);
    
        bool is_neighbor_label(const vertex_label &label) const;
    
        // etc
    protected:
        vertex_label label_;
        std::vector<vertex_label> neighbor_labels_;
    };