从两个类继承的空类,一个是模板 我正在构建一个小型图形库来学习C++和图论。我从一年只使用java,所以有一些事情我不太明白C++。

从两个类继承的空类,一个是模板 我正在构建一个小型图形库来学习C++和图论。我从一年只使用java,所以有一些事情我不太明白C++。,c++,graph,multiple-inheritance,C++,Graph,Multiple Inheritance,为了表示图的边,我分别为边(无方向、无权重)、有向边(无权重)、加权边(无方向)和有向加权边构建了四个类edge、d\u edge和dw\u edge 本能地,edge将是我的基类,其他类将从中继承。但是,据我所知,由于dw_-edge是d_-edge和w_-edge的“组合”,它应该从这两个类继承 目前,我已经定义了一些标题: //edge.hpp 阶级边缘{ 公众: 边(); std::pair get_顶点(); 受保护的: 顶点&v1,v2; }; //d_edge.hpp d类边缘:

为了表示图的边,我分别为边(无方向、无权重)、有向边(无权重)、加权边(无方向)和有向加权边构建了四个类
edge
d\u edge
dw\u edge

本能地,
edge
将是我的基类,其他类将从中继承。但是,据我所知,由于
dw_-edge
d_-edge
w_-edge
的“组合”,它应该从这两个类继承

目前,我已经定义了一些标题:

//edge.hpp
阶级边缘{
公众:
边();
std::pair get_顶点();
受保护的:
顶点&v1,v2;
};
//d_edge.hpp
d类边缘:公共边缘{
公众:
顶点&get_start_vertex();
顶点&get_end_vertex();
无效反向();
};
//w_edge.hpp
模板
类别w_边缘:公共边缘{
公众:
w_边(顶点和v1、顶点和v2、T和重量);
w_边缘(边缘和e、T和重量);
T&get_weight();
空套重量(T和重量);
受保护的:
T&重量;
};
//dw_edge.hpp
模板//?????
类dw_边:公共d_边,公共w_边{};
所以。。。嗯我可以有一个空的
dw\u edge
类实现吗?
它是坏的还是相当好的

此外,正如您在上面的代码中所看到的,
dw_edge
扩展了
w_edge
,这是一个模板类是否
dw_edge
必须是模板类,或者我可以删除该语句?

所以。。。嗯我可以有一个空的
dw\u edge
类吗?
它是坏的还是相当好的

是的,您可以有一个空的
dw_edge
类,它将从其父类继承所有方法。它的好坏取决于您计划对派生类做什么。您当前的示例看起来不错

dw_edge必须是模板类,还是我可以删除该语句?

不,您可以执行以下操作:

class dw_edge: public d_edge, public w_edge<Type> {};
类dw_边:公共d_边,公共w_边{};
其中,type是您指定的类型(
int
char
long
,等等)。因为您是从模板化类继承的,所以它确实需要将其模板参数传递给它

所以。。。嗯我可以有一个空的
dw\u edge
类吗?
它是坏的还是相当好的

是的,您可以有一个空的
dw_edge
类,它将从其父类继承所有方法。它的好坏取决于您计划对派生类做什么。您当前的示例看起来不错

dw_edge必须是模板类,还是我可以删除该语句?

不,您可以执行以下操作:

class dw_edge: public d_edge, public w_edge<Type> {};
类dw_边:公共d_边,公共w_边{};

其中,type是您指定的类型(
int
char
long
,等等)。由于您是从模板化类继承的,因此它确实需要将其模板参数传递给它。

有比继承更优雅的方法来解决此问题。如果边未加权(为什么需要对权重进行模板化?),则只需创建一个边类并将权重设置为1,然后创建一个枚举以指示向前、向后或无方向的边

也就是说,如果您想使用继承,您需要这样编写:

template <class T> class dw_edge: public d_edge, public w_edge<T> {};
模板类dw_-edge:public d_-edge,public w_-edge{};

解决这个问题有比继承更优雅的方法。如果边未加权(为什么需要对权重进行模板化?),则只需创建一个边类并将权重设置为1,然后创建一个枚举以指示向前、向后或无方向的边

也就是说,如果您想使用继承,您需要这样编写:

template <class T> class dw_edge: public d_edge, public w_edge<T> {};
模板类dw_-edge:public d_-edge,public w_-edge{};

感谢您的快速回答!你能告诉我你认为这是不是一个好的做法吗?我觉得这很自然,但我不知道是否有更好的方法。@CarlosMiranda多重继承之类的东西是最好的。(链接的答案非常好)。虽然这可能不适用于您的情况,但最好小心处理此类继承。谢谢您的快速回答!你能告诉我你认为这是不是一个好的做法吗?我觉得这很自然,但我不知道是否有更好的方法。@CarlosMiranda多重继承之类的东西是最好的。(链接的答案非常好)。虽然这可能不适用于您的情况,但最好小心这种继承。或者您可以在继承时指定类型,而不将dw_edge设置为模板类。(例如
类dw_-edge:public d_-edge,public w_-edge{};
)好的,谢谢!我希望它被模板化,因为我想用它来解决自动机理论课程中的一些问题,在某些情况下,我需要双精度或整数,以及其他一些字符和字符串。或者,您可以在继承时指定类型,而不必使dw_edge成为模板类。(例如
类dw_-edge:public d_-edge,public w_-edge{};
)好的,谢谢!我希望它被模板化,因为我想用它来解决我的自动机理论课程中的一些问题,在某些情况下,我想要双精度或整数,以及一些其他的字符和字符串。