【问题标题】:Pointer to base class in derived class as a member variable派生类中基类的指针作为成员变量
【发布时间】:2020-04-16 08:37:34
【问题描述】:

我从代码中看到派生类有一个成员变量,它是指向其基类的指针,像这样

class Base {
private: 
    int a;
    int b;
    int d;
    void init(){// ... }
public:
    Base(int a_ , int b_) :  a(a_), b(b_){
     init();
    }
    Base() = default; 
    int getA(){return a;}

}


class Derived : public Base {
    private: 
       Base* base;
       int c; 
    public: 
       Derived(int a_, int b_, int c_): base(new(Base(a_, b_)), c(c_){base->getA() // for initialization of another function};
    }

int main(){

Derived derived(0,0,0); 
}

这很聪明吗?如果我们可以从 Derived 调用 Base 的公共或受保护方法,为什么或如何在 Derived 类中拥有一个 Base 成员?

另一个问题是:我得到了两次 Base 构造,对吗?一个用于调用默认构造函数的派生对象,另一个用于调用非默认构造函数的初始化列表。

编辑: 我提供的代码是我进入的非常简短的版本。他们使用派生的基本成员来做很多事情,即调用 Base 的成员作为其他函数的参数或初始化 Derived 的成员。我的想法是它可能只是为了封装。但这肯定很奇怪。

希望我的问题不会太混乱!我只是不明白这样的主要用途是什么!

【问题讨论】:

  • 不,绝对不聪明。也许有使这有意义的上下文,但您的具体示例是 100% 没有意义的,并且至少有三个额外的问题:(1)它违反了三规则,(2)相关地,它使用了不必要的手动内存管理,(3)基类init 函数是一种反模式,应该只使用构造函数来替换。

标签: c++ inheritance


【解决方案1】:

查看此代码无法确定有用性(或智能性)(除非这是这些类的最终版本,在这种情况下,在派生类中实例化基类似乎没有用,因为它没有被使用),这取决于关于如何在 Derived 类中使用基础对象。

请注意,Derived 类中的基变量与 Derived 类继承自的 Base 类无关。

代码实例化2个对象,一个是Derived类的命名派生对象,另一个是派生类内部命名的基类(在派生构造函数中用new实例化)。

警告:上面的代码,如果没有为 Derived 类定义析构函数,会在 Derived 类对象被析构时导致基类对象丢失删除。

【讨论】:

    【解决方案2】:

    是的,你已经构造了 2 次甚至更多:你永远不会破坏第二个动态分配的类。 这看起来很奇怪

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 2011-01-27
      • 2016-07-31
      • 2016-02-23
      相关资源
      最近更新 更多