【问题标题】:Simple Subclassing简单的子类化
【发布时间】:2015-04-13 20:39:27
【问题描述】:

我最近了解了 C++ 中面向对象编程的概念,我在派生类时需要帮助。我相信这个问题的解决方案是微不足道的,只是我对一些类派生基础不熟悉。

所以我有这个:

struct Circle : Shape
{
    /* ... */
}

...而且效果很好。我试着像这样子类化 Circle:

struct Smiley : Circle
{
    using Circle::Circle; // use Circle's constructors?
    /* ... */
}

当我尝试在 main() 中使用一些参数初始化 Smiley 时,我收到了这种类型的错误:

no instance of constructor "Graph_lib::Smiley::Smiley" matches the argument list

main() 看起来像这样: Smiley happy{ Point{ 300, 200 }, 100 };

当我将类名从 Smiley 替换为 Circle 时,一切正常。

Circle happy{ Point{ 300, 200 }, 100 }; // this is ok and working

这是 Circle 的声明:

struct Circle : Shape {
    Circle(Point p, int rr);    // center and radius

    void draw_lines() const;

    Point center() const ; 
    int radius() const { return r; }
    void set_radius(int rr) { r=rr; }
private:
    int r;
};

有什么问题?

【问题讨论】:

  • 可以把代码发到main()吗?
  • Smiley happy{ Point{ 300, 200 }, 100 }; ,当我用 Circle 替换 Smiley 时,它工作正常。
  • 给我们一个行为重现的最小例子。
  • 您似乎正在使用的语言功能是 Constructor Inheritance,乍一看您的设置可能是正确的,但不知道 Circle 的实际构造函数以及您如何构建您的Smiley 无法判断。此外,包括您的工具链信息将是您问题的一个不错的补充,同时添加反映您的问题的准确来源。 See example.
  • 无论您遇到什么问题,都可能是您未向我们展示的代码中的问题,或者是您未告诉我们的其他问题,例如您使用的编译器版本。跨度>

标签: c++ oop


【解决方案1】:

编译器是问题所在。我下载了 2013 年 11 月的编译器,现在一切正常。谢谢@bames53

【讨论】:

    【解决方案2】:

    首先,结构和类之间存在细微差别。它主要必须处理公共/私人,但有区别。您的问题来自“使用 Circle::Circle”。如果没有更详细的代码示例,我将无法真正调试更多。但是,首先要查看 circle 构造函数的参数。如果您尝试将不同类型的 if 初始化参数(即 char 而不是 int)传递给 Smiley,它将不起作用。

    【讨论】:

    • 我完全清楚这一点。我已经说过几次了:我在 main() 中为 Smiley 和 Circle 使用了相同的参数。 Circle 变量工作正常,而 Smiley 给出了这个“invalid args”错误,但 Smiley 应该继承 Circle 的有效构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多