【发布时间】: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