预期输出:
Child = 2
Parent = 1
我的代码:
class Parent{
int a;
public:
void display(){
a = 1;
cout << "Parent = " << a << endl;
}
};
class Child:public Parent{
int b;
public:
void display(){
b = 2;
cout << "Child = " << b << endl;
}
};
int main()
{
Parent *p = new Child();
Child c;
//write your code here
/* My solution :
c.display();
Parent* a = &c;
a->display();
*/
}
我利用静态绑定成功调用了父类的display()成员函数
但是,我想知道这个问题是否有更好的解决方案。
拥有这条线的目的是什么Parent *p = new Child();
?它是指向构造函数的指针吗?
那条线和 有Parent *p = new Child;
什么区别?
如何在C++中调用父类的重写函数?
您实际上并没有覆盖示例中的任何函数。只有虚拟成员函数可以被覆盖,并且display
是非虚拟的。
我利用静态绑定成功调用了父类的display()成员函数
您的解决方案有效,因为不涉及覆盖或虚拟功能。另一种调用隐藏成员函数的方法是使用范围解析运算符:
c.Parent::display();
即使函数是虚拟的,这也会使用静态绑定。
拥有这条线的目的是什么
Parent *p = new Child();
?
它在您的程序中似乎没有任何目的。通常,new
用于从空闲存储中动态分配对象。
请注意,除非您显式地使用delete
. 也不delete p
会有未定义的行为,因为它指向一个析构函数是非虚拟的基类。
它是指向构造函数的指针吗?
No.p
指向在免费商店中创建的动态对象。
那条线和 有
Parent *p = new Child;
什么区别?
没有括号,您使用默认的初始化语法。对于空括号,您可以使用值初始化。
对于可简单构造的类(例如Parent
),默认初始化将默认初始化成员。在整数成员的情况下,这会使成员未初始化。值初始化将改为对成员进行值初始化,这对于整数意味着初始化为零。
对于非平凡可构造的类(例如Child
),默认和值初始化都会调用默认构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句