提问者:小点点

指向派生类中基类的指针作为成员变量


我从代码中看到派生类有一个成员变量,它是指向其基类的指针,如下所示

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); 
}

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

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

编辑:我介绍的代码是我所涉足的一个非常简短的版本。他们使用派生中的基础成员来做很多事情,例如调用Base的成员作为其他函数的参数或初始化派生的成员。我的想法是它可能只是为了封装。但这肯定很奇怪。

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


共2个答案

匿名用户

有用性(或智能性)不能通过看到这段代码来建立(除非这是那些类的最终版本,在这种情况下,在派生类中实例化一个基类似乎没有用,因为它没有被使用),这取决于你将如何使用派生类中的基对象。

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

代码实例化2对象一个是名为派生的派生类,另一个是派生类中名为base的对象(在派生构造函数中使用new实例化)。

警告:上面的代码没有定义派生类的析构函数,当派生类对象被析构时,会导致基类对象丢失删除。

匿名用户

是的,你已经构造了2次甚至更多:你从来没有销毁第二个动态分配的类。这看起来很奇怪