首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基类属性的不同初始化

基类属性的不同初始化
EN

Stack Overflow用户
提问于 2015-08-13 08:45:48
回答 2查看 105关注 0票数 7

考虑一个具有属性的基类。

代码语言:javascript
代码运行次数:0
运行
复制
class Base 
{
  protected:

  AttributeBase * elementPtr;
  ...
};

和一个派生类

代码语言:javascript
代码运行次数:0
运行
复制
class Derived : public Base
{
  ...
};

我还有一个类AttributeDerived,它是从AttributeBase派生的。

当我创建类Base的对象时,我希望以这种方式初始化elementPtr

代码语言:javascript
代码运行次数:0
运行
复制
elementPtr = new AttributeBase()

但是,当我创建类Derived的对象时,我希望以这种方式初始化elementPtr

代码语言:javascript
代码运行次数:0
运行
复制
elementPtr = new AttributeDerived()

最干净的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-13 08:49:52

您可以向protected添加一个Base构造函数,该构造函数允许派生类传递elementPtr以使用:

代码语言:javascript
代码运行次数:0
运行
复制
Base (AttributeBase* elementPtr) : elementPtr(elementPtr)
{}

然后在派生类中调用构造函数:

代码语言:javascript
代码运行次数:0
运行
复制
Derived() : Base(new AttributeDerived())
{}

如果使用C++11,则可以让其他Base构造函数委托到受保护的构造函数,以限制代码重复。

票数 5
EN

Stack Overflow用户

发布于 2015-08-13 08:53:15

您可以为不同的目的添加不同的Base函数:

代码语言:javascript
代码运行次数:0
运行
复制
class Base 
{
  protected:

    AttributeBase * elementPtr;
    Base(AttributeBase * p) : elementPtr(p) {}

  public:
    Base() : elementPtr(new AttributeBase) {}
};

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

然后

代码语言:javascript
代码运行次数:0
运行
复制
Base b;    // elementPtr = new AttributeBase()
Derived d; // elementPtr = new AttributeDerived()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31983470

复制
相关文章

相似问题

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