首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我们如何从c++的子类中调用父类的重载构造函数?

我们如何从c++的子类中调用父类的重载构造函数?
EN

Stack Overflow用户
提问于 2020-04-18 04:32:39
回答 1查看 370关注 0票数 2

如果我们有一个父类和两个子类。child1继承父类,child2继承Child1。在child2类中,我们如何在child2中调用child1和父类重载构造函数。

代码语言:javascript
运行
复制
class parents{
        int x;
        public:
        parents(int a)
        {
           x=a;
        }
        };
class child1 : public parents{
        int y;
        pulic:
        child1(int b)
        {
          y=b;
        }
        };
class child2 :public child1{
          int z;
          public:
          child2(int c)
          {
              z=c;
            // how we call above overloaded constructor in this overloaded cnstructor 
          }
          }; 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-18 04:37:21

这是在子类的构造函数的member initializer-list中完成的。因为parent不是child2的直接基础。你必须给你的直接基类(child)一个构造函数给child2,并且可能在child1的构造函数中,你可以初始化你的基类parent

因此,您必须在整个层次结构中传播基类中的初始化,但可以直接在child2的成员初始化器列表中处理“非常基本”的构造函数(parent)。

试试这个:

代码语言:javascript
运行
复制
class parents {
    int x;
public:
    parents(int a)
    {
      x = a;
    }
};
class child1: public parents {
    int y;
public:
    child1(int b): parents(b)
    {
      y = b;
    }
};

class child2: public child1{
    int z;
public:
    child2(int c): child1(c)
    {
      z = c;
    }
};

您可以使用virutal继承。虚拟库是上述语句的例外。

它们总是在叶子类中初始化,否则可能会为同一个基类调用多个构造函数。因此,如果您将基本设置为虚拟的,不仅可以在child2中对其进行初始化,还必须这样做。

此外,您实际上会被强制在任何“孙子”-class中调用它,所以您不会意外地忘记它:

代码语言:javascript
运行
复制
class parents {
    int x;
public:
    parents(int a)
    {
      x = a;
    }
};
class child1: public virtual parents {
    int y;
public:
    child1(int b): parents(b)
    {
      y = b;
    }
};

class child2: public virtual child1{
    int z;
public:
    child2(int c): child1(0), parents(1)
    {
      z = c;
    }
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61280195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档