2012-03-23 87 views
1

对不起,如果这个问题已经问了很多次,但希望通过自己提问来更快地找到信息。所以,问题是:超类中的默认构造函数是否有可能从它继承?假设每个派生类的构造函数都明确地调用了一个超类构造函数,提供了正确的参数 - 这样的代码是否工作?如果有需要,我可以提供一段代码片段来澄清我在说什么。提前致谢。C++:一个必须具有默认超类构造函数的继承?

+0

答案当然要看情况。例如,你有没有“超类”中的任何类型的数据? – 2012-03-23 10:10:31

+0

@MrLister,我正在谈论你可以想象的最简单的例子。请说明“它取决于”是什么意思。 – Egor 2012-03-23 10:13:04

+0

查看答案。如果没有成员在父类中初始化,则根本不需要编写任何构造函数。编译器将隐含地创建一个默认构造函数。 – 2012-03-23 10:17:18

回答

7

在超类中有一个默认构造函数是否有可能从它继承的可能性?

如果你没有在基类的默认构造函数,你需要从派生类的构造函数的成员初始化列表中调用基类的构造函数的参数(S)明确

实施例,

class base 
{ 
    public: 
    base(std::string const & s, int n); 
}; 

class derived : public base 
{ 
    anotherClass obj; 
    public: 
    derived() : base("string", 10), obj(100) 
    {  //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ member-initialization list 
    } 
}; 

base("string", 10)的语法。它调用基类的构造函数,传递"string"作为第一个参数,10作为第二个参数。

还要注意obj(100)它初始化成员变量这是anotherClass类型:obj(10)调用的anotherClass构造这需要int作为参数。

+2

这尤其意味着编译器不会为派生类自动生成默认构造函数。只是在说'。 – 2012-03-23 10:12:02

+1

@MatthieuM。如果您提供任何构造函数,编译器将不会自动生成一个构造函数。如果基类没有默认构造函数,并且编译器试图为派生类生成默认构造函数,那将是一个错误。 – 2012-03-23 10:18:47

+2

@JamesKanze:是的,我试图指出,如果基类没有默认构造函数,那么您一定需要为派生类提供至少一个构造函数。 – 2012-03-23 11:02:26

3

只要

  • 默认构造方法中没有明确地叫
  • 所有子类都在建设调用用户定义的超类的构造函数与参数

不强制写默认构造函数。

2

如果子类的每个构造函数都使用父类的显式构造函数,则不需要父类具有默认构造函数。

如果你有一个没有默认构造函数的类,每个人都被迫在实例化时使用一个显式的构造函数,对吧?这是一个概念,如果所有的孩子都确保从不调用默认的构造函数,那么就没有必要实现它。

2

不,有一个可能的例外。通常,基类构造函数 将由其派生类立即调用,使用该派生类提供的参数 (如果有的话)。如果所有的 直接派生类都明确地初始化基类,那么不需要任何 默认构造函数。

一个可能的例外是,如果你从类基地 虚拟继承。在这种情况下,它不是 初始化基类,而是派生类最多的直接派生类。并根据 关于如何组织您的类层次结构,您可能不希望最基本的派生类知道;大多数派生类只需知道它直接从中继承 的类就足够了。 (当然,这是一个理想情况,并不总是如此。)幸运的是,几乎每次发生这种情况时,基数都是一个没有数据的抽象类(因此具有默认构造函数)。但要注意的是 。

+0

但就语言而言,可能的例外不是一项义务。即使在这种情况下,该语言也不会强制您拥有默认构造函数。它更多的是关于类层次结构的设计,以及程序员的选择。 – Nawaz 2012-03-23 10:44:53

+0

@Nawaz该语言不强制你有一个默认的构造函数,但是如果你没有默认的构造函数,它确实会迫使你让最基本的类已知基类。取决于体系结构,这可能不是理想的。 – 2012-03-23 11:56:35

0

不,你不需要默认的构造函数。以下编译和运行,有或没有私有的默认构造函数。

class A { 
public: 

    A(int i) { 
    m = i; 
    } 

private: 

    A() { } // This line can be commented out. Included only to make point 

    int m; 
}; 

class B : A { 
public: 

    B(int i) 
    : A(i) 
    { 
    } 

}; 

int main() { 
    B b(10); 
} 
相关问题