- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个相似的类继承自同一个基类/接口(interface)(基类 1),它们共享一些相似的功能,但也有自己独特的功能。它们也都有自己的不同类的成员变量,并且每个都继承自相同的基类/接口(interface)(基类 2)。是否可以在基类 1 中定义一个基类 2 类型的变量,然后在使用基类 1 的类的实际实现中,将基类 2 类型的变量作为其正确类型。有点难以解释,下面简化了示例。
//Base-Class 1
class Shape
{
public Shape() {}
ShapeExtra m_var;
//The common functions
public GetVar(){ return m_var; }
}
class Circle : Shape
{
public Circle() { m_var = new CircleExtra(); }
public void CircleFunc()
{
m_var.CircleExtraFunc();
}
}
class Triangle : Shape
{
public Triangle() { m_var = new TriangleExtra(); }
public void TriangleFunc()
{
m_var.TriangleExtraFunc();
}
}
.
.
.
//Base_Class 2
class ShapeExtra
{
public ShapeExtra() {}
}
class CircleExtra : ExtraClass
{
public CircleExtra() {}
void CircleExtraFunc() {//Do stuff}
}
class TriangleExtra : ExtraClass
{
public TriangleExtra() {}
void TriangleExtra() {//Do stuff}
}
.
.
.
因此,我需要将子类中的 m_var
保留为它自己的唯一版本。因为现在(没有额外的 CircleExtra m_var;
),GetVar()
可以工作,但是在 CircleFunc
中,m_var
仍然是 ShapeExtra
的类型,因此不知道 CircleExtraFunc
存在。每次我想这样做时,我都可以转换 m_var
,但这是重复的,在我的真实案例中不值得这样做。有没有一种方法可以利用基于 ShapeExtra
的独特类中的函数,同时在 Shape
中保留 GetVar()
函数?
如果我遗漏了什么,请提问。
最佳答案
仅仅通过继承而不使用指针是不可能的,因为 C++ 是一种静态和严格类型的语言。
您可以同时继承变量和函数,但您需要转换函数返回值。
您也可以重写该函数以使其返回具体类型,但您必须在函数内部强制转换变量。
您也可以在子类中声明与具体类相同的 var,但这样您只是将变量隐藏在父类(super class)中并且不继承任何内容。
我宁愿选择使用模板的解决方案。使变量的类型成为模板类型,并在子类中使用具体类型扩展模板。它会完美地工作。
距离上次用C++编程已经有很长一段时间了,如果下面的例子中有错误,请多多包涵。我相信您可以轻松实现它。
template <class S>
class Shape {
S m_var;
//......
public:
S var () {
return m_var;
}
//.......
}
class Circle: Shape <CircleExtra> {
// var method returns CircleExtra
//......
}
编辑:关于一些评论,为了允许方法的虚拟调用,可以使用相关的返回类型。类似于以下示例。
class Shape {
public:
virtual ShapeExtra *var () = 0;
}
template <typename SE>
class ConcreteShape: Shape {
public:
virtual SE *var() {
return &m_var;
}
// Constructor, etc.
private:
SE m_var;
}
或者一些变化。现在具体形状可以从扩展模板中受益,只要 SE * 与 ShapeExtra * 相关(类型参数扩展 ShapeExtra)。您可以通过 Shape 接口(interface)透明地调用该方法。
关于c++ - 父类引用子变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272381/
我是一名优秀的程序员,十分优秀!