构造函数不能是虚函数
A constructor cannot be virtual
在网上的一个c++教程中,我发现了下面关于构造函数为什么不能是虚拟的描述
不能声明虚构造函数。我们应该详细说明类型,以便编译器可以分配指定类型的内存
这个描述正确吗?
我对这个短语特别困惑:so that the compiler can allocate
memory for that specific type
正如Bjarne在他的c++风格和技术常见问题解答中所解释的:
虚调用是在给定部分信息的情况下完成工作的一种机制。特别是"虚拟的"。允许我们只知道接口而不知道对象的确切类型来调用函数。要创建对象,您需要完整的信息。特别是,您需要知道要创建的内容的确切类型。因此,调用构造函数
构造函数不能是虚函数,因为标准是这样规定的。
标准这么说是因为它没有意义。虚构造函数会做什么?
虚方法用于多态性…如果还没有对象,多态应该如何工作?
应该在编译时指定对象的确切类型,因此编译器可以为该特定类型分配内存。
我们应该在编译时指定确切的类型,因为我们想要该类型的对象…我发现他们的描述也很令人困惑。
同样,在段落中它没有说这是构造函数不能是虚函数的原因。它解释了为什么不应该从构造函数调用虚方法,但仅此而已。
构造函数如何能够是virtual
?virtual
意味着调用该函数的结果由对象的动态类型决定。施工前,不反对这样做。
教程中的短语,构造函数是什么,也是假的。需要指定确切的类型,否则你声明的东西不会被视为构造函数,没有返回类型的函数是不允许的。
再补充一下,这里有一种虚拟构造函数设计模式,也称为工厂方法或工厂函数:
…它处理创建对象(产品)的问题,而不指定要创建的对象的确切类
这是正确的,尽管在我看来它没有抓住重点。
构造函数设置虚拟调度,即将正确的指针指向当前类的函数。如果构造函数可以是虚拟的,谁会事先设置虚拟构造函数呢?这将是一个可怕的鸡生蛋还是蛋生鸡的问题。
然而,有一种称为"虚拟构造函数"的习惯用法,在这种习惯用法中,类的静态成员返回带有合适类的基类指针:class A {
static A* create();
virtual ~A();
};
class B : public A { ... };
A* A::create() { return new B(); }
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么虚函数不能是静态的和全局的?
- 为什么继承的受保护构造函数不能公开?
- C++为什么类成员函数不能重新声明,但普通函数可以
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 为什么模板函数不能作为模板模板参数传递?
- 为什么 free 函数不能在 C 数组上运行,而 std::begin 在某些情况下可以在 C++14 中运行?
- 构造函数不能用于启发性化
- C 错误 - 函数不能超载
- 有没有办法使成员函数不能从构造函数调用
- 为什么模板函数不能是模板类的友元模板函数
- "Framework::Graphics::Material"的默认构造函数不能被引用 - 它是一个已删除的函数
- lower_bound()函数不能在调试模式下编译
- 为什么函数不能正确强制转换指针(从基类到派生类)
- 显式默认函数不能声明为 constexpr,因为隐式声明不是 constexpr
- 琐碎的默认构造函数不能是 constexpr?
- 函数不能嵌套,那么如何在C++中执行此操作
- 错误:成员函数不能在其类之外声明
- 错误-仅返回类型不同的函数不能重载.c++