gpt4 book ai didi

c++ - 父类引用子变量

转载 作者:行者123 更新时间:2023-11-27 23:57:50 31 4
gpt4 key购买 nike

我有几个相似的类继承自同一个基类/接口(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/

31 4 0
文章推荐: html - 这个 href 打开新窗口在 ie7 中不起作用?
文章推荐: html - CSS中每个页面发布 "Header"的问题
文章推荐: html - anchor 标签底部的空白
文章推荐: html - 此处语义正确的是 还是