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”(位于平面某处的顶点)。我正在考虑两种方法:
Point
成员谢谢你的见解 通常情况下,除非你有充分的理由进行多重继承,否则要避免多重继承 原因:
因此,回答您的问题:看起来您没有足够的理由使用多重继承。使用组合。通常,除非您有充分的理由进行多重继承,否则请避免使用组合 原因:
因此,回答您的问题:看起来您没有足够的理由使用多重继承。使用合成。可能还有第三种选择。您可以像标准库一样,将
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_;
};