【问题标题】:constructors inherited in c++在 C++ 中继承的构造函数
【发布时间】:2015-06-09 10:21:00
【问题描述】:

Excerpt from here:

构造函数与其他类方法的不同之处在于它们创建新对象,而其他方法由现有对象调用。这是构造函数不被继承的原因之一。继承意味着派生对象可以使用基类方法,但在构造函数的情况下,对象在构造函数完成工作之前不存在。

  1. 构造函数是创建新对象还是在调用对象时 立即调用构造函数?

  2. 据说构造函数和析构函数不被继承 从基类到派生类但是是下面的程序 矛盾的是,我们正在创建派生类的对象,但它 还输出基类的构造函数和析构函数?


class A{
public:
    A(){
        cout<< Const A called<<endl;
    }
    ~A(){
        cout<< Dest A called <<endl;
    }
};

Class B : public A{
public:
    B(){
        cout<< Const B called <<endl;
    }
    ~B(){
        cout<< Dest B called <<endl;
    }
};

int main(){
    B obj;
    return 0;
}

输出:

调用常量 A

调用常量 B

目标 B 调用

目标 A 调用

【问题讨论】:

  • A中定义带参数的构造函数,然后看看B是否继承了带参数的构造函数。
  • 那是一个非常具有误导性的帖子,基于一本非常具有误导性的引述,该引述来自一本没有被高度重视为 C++ 知识来源的书。您应该简单地忽略所有这些。派生类从其基类继承所有成员。
  • C++11及以后支持构造函数继承,所以前提不正确

标签: c++ inheritance constructor


【解决方案1】:

派生类D 不会从B 继承构造函数,因为没有明确指定D 构造函数,我可以使用我的B(int) 来构造new D(1);

但是,我可以做的是在派生类构造函数的定义中使用基类构造函数,例如D::D(void) : B(1) {}

不那么抽象,假设我有一个 Person 的构造函数,它接受 gender 参数,我可能希望创建一个:

class Son: Person{
public:
    Son(void) : Person(male) {};
};

构造一个Son,这显然是一个Person,但肯定不需要参数化gender

D::~D(){} 的右大括号上隐含对 ~B() 的调用的意义上,析构函数是“继承的”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2019-01-21
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多