如何在C++中调用父类的重写函数?

ZZZZ

预期输出:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章