【问题标题】:Pass Parameter to Base Class Constructor while creating Derived class Object在创建派生类对象时将参数传递给基类构造函数
【发布时间】:2013-05-11 06:04:33
【问题描述】:

考虑两个类 AB

class A
{
public:
    A(int);
    ~A();
};

class B : public A
{
public:
    B(int);
    ~B();
};


int main()
{
    A* aobj;
    B* bobj = new bobj(5);    
}

现在B 类继承A

我想创建一个B 的对象。我知道创建派生类对象也会调用基类构造函数,但这是没有任何参数的默认构造函数。

我想要的是 B 获取一个参数(比如 5),并将其传递给 A 的构造函数。 请展示一些代码来演示这个概念。

【问题讨论】:

  • B::B(int val) : A(val) {}
  • 我以为你想让析构函数接受参数,对我来说看起来不像是错字。并且不需要来自!!。否决票已恢复,评论已删除。

标签: c++ oop constructor


【解决方案1】:

使用基成员初始化:

class B : public A
{
public:
    B(int a) : A(a)
    {
    }
    ~B();
};

【讨论】:

  • 如果构造函数的定义在不同的文件中怎么办?
  • @Bathsheba 如果我想在基类构造函数中传递不同的值怎么办?例如在main.cppB b1(3);构造函数B通过传递值3被调用,你定义构造函数的方式,基类构造函数A也被传递值3调用,是的,我们可以在定义 B 类的构造函数时通过 B(int a): A(k) 替换 B(int a): A(a) 来更改它 k 是我们想要的任何常量,但它是在定义时。我只想在调用时传递基本构造函数的值。像B b1(3):(4); 这样的语法可能是错误的,但有什么办法可以做这样的事情
【解决方案2】:
B::B(int x):A(x)
{
    //Body of B constructor
}

【讨论】:

    【解决方案3】:

    如果您使用派生类构造函数只是将参数传递给基类,那么您也可以在 C++11 中以更短的方式执行此操作:

    class B : public A
    {
        using A::A;
    };
    

    请注意,我之前什至没有使用过“公共”访问说明符。这不是必需的,因为继承的构造函数被隐式声明为具有与基类相同的访问级别。

    更多细节请参考继承构造函数部分:https://en.cppreference.com/w/cpp/language/using_declaration

    您也可以参考https://softwareengineering.stackexchange.com/a/307648 了解构造函数继承的限制。

    【讨论】:

      【解决方案4】:

      A 级 { 民众: 整数;

      A(int a):aval(a){};
      ~A();
      

      };

      B 类:公共 A { 民众: int bval;

      B(int a,int b):bval(a),A(b){};
      ~B();
      

      };

      int main() {

        B *bobj = new bobj(5,6);
      //or 
        A *aobj=new bobj(5,6); 
      

      }

      在这种情况下,您正在为基类和派生类分配值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2012-07-05
        • 1970-01-01
        • 2015-08-20
        • 2013-09-14
        • 2014-12-25
        相关资源
        最近更新 更多