我有一些问题。
如果我有一个A类,我通过以下方式创建一个实例:A* a = new A()
;
我看到构造函数被调用了两次。
这没有意义。我是程序员只创建一次这个对象,因此我认为构造函数只会被调用一次,不是吗?
A* a = new A
和A* = new A()
之间有什么区别?
默认构造函数是什么?如果我在类A中有一个不带参数的构造函数,它是默认的构造函数吗?或者,如果我没有声明没有参数的构造函数,它是构造函数吗?
如果我有B级继承自A,并且A,B中有一个名为foo
的函数。
如果foo
是虚拟的并且foo
不是虚拟的,那么虚拟表有什么区别?
答案 0 :(得分:2)
1)我不知道你mean是什么,它只被叫一次。
2)是的,默认构造函数是不带参数的构造函数。如果你没有声明一个,编译器将生成一个,但它可能不是你想要的那个。
3)如果foo
中的A
是虚拟的,则动态绑定将适用。如果foo
不是虚拟的,则不会。
A *a = new B();
a->foo(); //will call b::foo()
答案 1 :(得分:1)
A* a = new A
和A* a = new A()
之间没有区别。foo
未声明为虚拟,则不会有虚拟表格;编译器将在编译时在调用foo
的位置插入实际的函数地址。如果它是虚拟的,则编译器会生成一些代码,以根据调用foo
的对象类型在虚拟表中查找函数的地址。