对不起,如果这个问题已经问了很多次,但希望通过自己提问来更快地找到信息。所以,问题是:超类中的默认构造函数是否有可能从它继承?假设每个派生类的构造函数都明确地调用了一个超类构造函数,提供了正确的参数 - 这样的代码是否工作?如果有需要,我可以提供一段代码片段来澄清我在说什么。提前致谢。C++:一个必须具有默认超类构造函数的继承?
回答
在超类中有一个默认构造函数是否有可能从它继承的可能性?
号
如果你没有在基类的默认构造函数,你需要从派生类的构造函数的成员初始化列表中调用基类的构造函数的参数(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
作为参数。
这尤其意味着编译器不会为派生类自动生成默认构造函数。只是在说'。 – 2012-03-23 10:12:02
@MatthieuM。如果您提供任何构造函数,编译器将不会自动生成一个构造函数。如果基类没有默认构造函数,并且编译器试图为派生类生成默认构造函数,那将是一个错误。 – 2012-03-23 10:18:47
@JamesKanze:是的,我试图指出,如果基类没有默认构造函数,那么您一定需要为派生类提供至少一个构造函数。 – 2012-03-23 11:02:26
只要
- 默认构造方法中没有明确地叫
- 所有子类都在建设调用用户定义的超类的构造函数与参数
不强制写默认构造函数。
如果子类的每个构造函数都使用父类的显式构造函数,则不需要父类具有默认构造函数。
如果你有一个没有默认构造函数的类,每个人都被迫在实例化时使用一个显式的构造函数,对吧?这是一个概念,如果所有的孩子都确保从不调用默认的构造函数,那么就没有必要实现它。
不,有一个可能的例外。通常,基类构造函数 将由其派生类立即调用,使用该派生类提供的参数 (如果有的话)。如果所有的 直接派生类都明确地初始化基类,那么不需要任何 默认构造函数。
一个可能的例外是,如果你从类基地 虚拟继承。在这种情况下,它不是 初始化基类,而是派生类最多的直接派生类。并根据 关于如何组织您的类层次结构,您可能不希望最基本的派生类知道;大多数派生类只需知道它直接从中继承 的类就足够了。 (当然,这是一个理想情况,并不总是如此。)幸运的是,几乎每次发生这种情况时,基数都是一个没有数据的抽象类(因此具有默认构造函数)。但要注意的是 。
但就语言而言,可能的例外不是一项义务。即使在这种情况下,该语言也不会强制您拥有默认构造函数。它更多的是关于类层次结构的设计,以及程序员的选择。 – Nawaz 2012-03-23 10:44:53
@Nawaz该语言不强制你有一个默认的构造函数,但是如果你没有默认的构造函数,它确实会迫使你让最基本的类已知基类。取决于体系结构,这可能不是理想的。 – 2012-03-23 11:56:35
不,你不需要默认的构造函数。以下编译和运行,有或没有私有的默认构造函数。
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);
}
- 1. 约束 - 派生类必须有一个默认构造函数
- 2. IXmlSerializable类型'System.Xml.Linq.XElement'必须具有默认构造函数
- 3. 没有默认构造函数 - 继承
- 4. 你必须有一个默认的构造函数吗?
- 5. 从类继承的类没有默认的构造函数
- 6. 从超类继承构造函数?
- 7. C++一个类的默认构造函数调用另一个类的另一个默认构造函数
- 8. 为什么具有继承构造函数的类还会获得合成的默认构造函数?
- 9. 具有默认参数的类继承
- 10. C++继承类的构造函数
- 11. 子类构造函数 - 为什么必须为子类构造函数存在默认构造函数?
- 12. 继承:没有适当的默认构造函数可用
- 13. 如何避免继承的类必须通过基类构造函数参数
- 14. 具有参数构造函数的基类的继承
- 15. C++,默认构造函数
- 16. 不能继承基控制器类没有默认的构造函数
- 17. 父类默认构造函数由用户输入,然后通过继承 - C++
- 18. 默认的构造函数和虚拟继承
- 19. Java中的默认构造函数和继承
- 20. iText接收默认构造函数无法处理由隐式超级构造函数抛出的异常类型IOException。必须定义一个显式构造
- 21. 为什么默认构造函数在父类中是必需的,如果它具有参数构造函数?
- 22. 通过定义默认私有构造函数使类不可继承
- 23. 默认构造函数未定义隐式超级构造函数getdata()。必须定义一个明确的构造函数
- 24. 继承的泛型构造函数C#
- 25. C++中的继承构造函数
- 26. 继承虚基类的构造函数
- 27. C++构造函数重载解析具有多重继承
- 28. 默认情况下继承构造函数noexcept(true)吗?
- 29. java继承问题 - 必须在父类中创建空构造函数
- 30. 从C++中的私有模板类继承构造函数
答案当然要看情况。例如,你有没有“超类”中的任何类型的数据? – 2012-03-23 10:10:31
@MrLister,我正在谈论你可以想象的最简单的例子。请说明“它取决于”是什么意思。 – Egor 2012-03-23 10:13:04
查看答案。如果没有成员在父类中初始化,则根本不需要编写任何构造函数。编译器将隐含地创建一个默认构造函数。 – 2012-03-23 10:17:18