我从代码中看到派生类有一个成员变量,它是指向其基类的指针,如下所示
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对象一个是名为派生的派生类,另一个是派生类中名为base的对象(在派生构造函数中使用new实例化)。
警告:上面的代码没有定义派生类的析构函数,当派生类对象被析构时,会导致基类对象丢失删除。
是的,你已经构造了2次甚至更多:你从来没有销毁第二个动态分配的类。这看起来很奇怪