【问题标题】:Providing base class constructor parameters when creating a derived class instance创建派生类实例时提供基类构造函数参数
【发布时间】:2012-07-05 06:47:38
【问题描述】:

有没有办法在新建派生类实例时为基类提供构造函数参数? (即当基类构造函数对这些参数有默认值时)

例如

class Base
{
public:
 Base::Base( string name = "" )
 : m_name( name ) {};

private
 string m_name;
};

class Derived : public Base
{
public:
 Derived::Derived() {};
};

那么我需要做这样的事情:

void main()
{
 Base* instance = new Derived( "Jeff" );
};

这显然行不通。有没有办法新建一个派生实例并为其基类提供构造函数参数,而不必在派生类构造函数中提供该参数。

【问题讨论】:

    标签: c++ constructor polymorphism new-operator parent-child


    【解决方案1】:

    有没有办法新建一个派生实例并为其基类提供构造函数参数,而不必在派生类构造函数中提供该参数。

    没有。

    您的派生类构造函数需要接受参数,并将它们显式传递给基类构造函数。

    class Derived : public Base
    {
    public:
     Derived::Derived(string name) : Base(name) {};
    };
    

    无论您是否使用new,都是如此。

    【讨论】:

    • 我希望有一种方法可以避免在派生构造函数中提供参数。这是唯一的方法吗?
    • @MarcusTomlinson:差不多。显然,我的建议有多种变体,但它们都涉及Derived 构造函数,在其初始化列表中显式调用Base 构造函数。但这是有道理的; Derived 派生自 Base 的事实是构建时的实现细节;这个事实本质上是封装的。
    • 如果您不想更改构造函数,您可以添加可以在构造后设置的属性(例如,Base 中的 setName(string) 方法)。然后,如果有人默认构造了一个Derived 实例,他们随后可以调用instance.setName("Jeff")
    • 真正我主要关心的是变量被设置在前面并且只设置一次 - 使用设置器不会满足前者但可以满足后者。
    【解决方案2】:

    如果你想在基类中使用不同的名称,你就不能这样做。但是不同的名称不是标准,您可以使用传递常量文字来做到这一点:

    class Base
    {
    public:
     Base::Base( string name = "" )
     : m_name( name ) {};
    
    private
     string m_name;
    };
    
    class Derived : public Base
    {
    public:
     Derived::Derived() : Base ("Jeff")    {};
     Derived::Derived(string &name) : Base (name) {};
    };
    

    或将默认值传递给派生类构造函数。

    class Derived : public Base
        {
        public:
         Derived::Derived(string name = "Jeff") : Base (name) {};
        };
    

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 2011-06-04
      • 2013-05-11
      • 2011-09-27
      • 2017-11-24
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多